{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "8a6826e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "import argparse\n",
    "import os\n",
    "import random\n",
    "import shutil\n",
    "import time\n",
    "\n",
    "import torch\n",
    "import torch.backends.cudnn as cudnn\n",
    "import torch.nn as nn\n",
    "import torch.nn.parallel\n",
    "import torch.optim\n",
    "import torch.utils.data\n",
    "import torchvision.datasets as datasets\n",
    "import torchvision.models as models\n",
    "import torchvision.transforms as transforms\n",
    "import torch\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms\n",
    "\n",
    "import copy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "390098eb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n"
     ]
    }
   ],
   "source": [
    "    transform_train = transforms.Compose([\n",
    "        transforms.RandomCrop(32, padding=4),\n",
    "        transforms.RandomHorizontalFlip(),\n",
    "        transforms.ToTensor(),\n",
    "        transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),\n",
    "    ])\n",
    "    transform_test = transforms.Compose([\n",
    "        transforms.ToTensor(),\n",
    "        transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),\n",
    "    ])\n",
    "\n",
    "\n",
    "    #train_set = datasets.CIFAR100('./data/CIFAR100', train=True,download=True, transform=transform_train)\n",
    "    #test_set = datasets.CIFAR100('./data/CIFAR100', train=False,download=True, transform=transform_test)\n",
    "\n",
    "    #train_loader = torch.utils.data.DataLoader(train_set, batch_size=256,shuffle=True, num_workers=2)\n",
    "    #val_loader = torch.utils.data.DataLoader(test_set, batch_size=256,shuffle=False, num_workers=2)\n",
    "\n",
    "    #train_dataset = torchvision.datasets.CIFAR100(root='./data/CIFAR100', train=True,download=False, transform=transform_train)\n",
    "\n",
    "    #val_dataset = torchvision.datasets.CIFAR100(root='./data/CIFAR100', train=False,download=False)\n",
    "    \n",
    "    # 加载数据集\n",
    "    trainset = torchvision.datasets.CIFAR100(root='./data/CIFAR100', train=True, download=True, transform=transform_train)\n",
    "    trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)\n",
    "\n",
    "    testset = torchvision.datasets.CIFAR100(root='./data/CIFAR100', train=False, download=True, transform=transform_test)\n",
    "    testloader = torch.utils.data.DataLoader(testset, batch_size=100, shuffle=False, num_workers=2)\n",
    "        \n",
    "        \n",
    "\n",
    "CIFAR100_class = 100  # 数据集的分类类别数量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "27d6825b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "\n",
    "is_CELU = False\n",
    "is_ELU = False\n",
    "is_GELU = True\n",
    "\n",
    "\n",
    "#SE模块\n",
    "class SEModule(nn.Module):\n",
    "    def __init__(self, channels, reduction=16):\n",
    "        super(SEModule, self).__init__()\n",
    "        self.avg_pool = nn.AdaptiveAvgPool2d(1)\n",
    "        self.fc1 = nn.Conv2d(channels, channels // reduction, kernel_size=1, padding=0)\n",
    "        if is_CELU:\n",
    "            self.af = nn.CELU(inplace=True)\n",
    "        elif is_ELU:\n",
    "            self.af = nn.ELU(inplace=True)\n",
    "        elif is_GELU:\n",
    "            self.af = nn.GELU()  # 添加 GELU 激活函数\n",
    "        else:\n",
    "            self.af = nn.ReLU(inplace=True)\n",
    "        self.fc2 = nn.Conv2d(channels // reduction, channels, kernel_size=1, padding=0)\n",
    "        self.sigmoid = nn.Sigmoid()\n",
    "\n",
    "    def forward(self, input):\n",
    "        x = self.avg_pool(input)\n",
    "        x = self.fc1(x)\n",
    "        #x = self.relu(x)\n",
    "        x = self.af(x)\n",
    "        x = self.fc2(x)\n",
    "        x = self.sigmoid(x)\n",
    "        return input * x\n",
    "\n",
    "\n",
    "# 残差层\n",
    "class Bottleneck(nn.Module):\n",
    "    # 输出通道数为输入通道数的4倍\n",
    "    expansion = 4\n",
    "\n",
    "    def __init__(self, inplanes, planes, stride=1, downsample=None, scales=4, groups=1, is_first_block=0, se=True):\n",
    "        super(Bottleneck, self).__init__()\n",
    "\n",
    "        self.downsample = downsample\n",
    "        self.scales = scales\n",
    "        self.groups = groups\n",
    "        self.stride = stride\n",
    "        self.is_first_block = is_first_block\n",
    "\n",
    "        outplanes = groups * planes\n",
    "        # 第一个卷积层：卷积核尺寸： 1×1 ，填充值为 0， 步长为 1\n",
    "        self.conv1 = nn.Conv2d(in_channels=inplanes, out_channels=outplanes, kernel_size=1, stride=1, bias=False)\n",
    "        self.bn1 = nn.BatchNorm2d(outplanes)\n",
    "\n",
    "        # 第二个卷积结构：卷积核尺寸： 3×3 ，填充值为 1， 步长为 1\n",
    "        self.conv2 = nn.ModuleList([nn.Conv2d(outplanes // scales, outplanes // scales,\n",
    "                                              kernel_size=3, stride=stride, padding=1, groups=groups, bias=False) for _ in\n",
    "                                    range(scales - 1)])\n",
    "        self.bn2 = nn.ModuleList([nn.BatchNorm2d(outplanes // scales) for _ in range(scales - 1)])\n",
    "\n",
    "        # 第三个卷积层：卷积核尺寸： 1×1 ，填充值为 0， 步长为 1\n",
    "        self.conv3 = nn.Conv2d(outplanes, planes * self.expansion, kernel_size=1, stride=1, bias=False)\n",
    "        self.bn3 = nn.BatchNorm2d(planes * self.expansion)\n",
    "\n",
    "        #self.relu = nn.ReLU(inplace=True)\n",
    "        if is_CELU:\n",
    "            self.af = nn.CELU(inplace=True)\n",
    "        elif is_ELU:\n",
    "            self.af = nn.ELU(inplace=True)\n",
    "        elif is_GELU:\n",
    "            self.af = nn.GELU()  # 添加 GELU 激活函数\n",
    "        else:\n",
    "            self.af = nn.ReLU(inplace=True)\n",
    "        \n",
    "        # 处理第一个块\n",
    "        if is_first_block == 1:\n",
    "            self.pool = nn.AvgPool2d(kernel_size=3, stride=stride, padding=1)\n",
    "\n",
    "        # SE模块\n",
    "        self.se = SEModule(planes * self.expansion) if se else None\n",
    "\n",
    "    def forward(self, x):\n",
    "        identity = x # 将原始输入暂存为shortcut的输出\n",
    "        # 对下采样进行处理\n",
    "        if self.downsample is not None:\n",
    "            identity = self.downsample(identity)\n",
    "\n",
    "        # 1*1卷积层\n",
    "        out = self.conv1(x)\n",
    "        out = self.bn1(out)\n",
    "        #out = self.relu(out)\n",
    "        out = self.af(out)\n",
    "\n",
    "        #按尺度分块\n",
    "        x_scales = torch.chunk(out, self.scales, 1)\n",
    "        for i in range(self.scales-1):\n",
    "            if i == 0 or self.is_first_block == 1:\n",
    "                y_scale = x_scales[i]\n",
    "            else:\n",
    "                y_scale = y_scale + x_scales[i]\n",
    "            y_scale = self.conv2[i](y_scale)\n",
    "            #y_scale = self.relu(self.bn2[i](y_scale))\n",
    "            y_scale = self.af(self.bn2[i](y_scale))\n",
    "            if i == 0:\n",
    "                out = y_scale\n",
    "            else:\n",
    "                out = torch.cat((out, y_scale), 1)\n",
    "        if self.scales != 1 and self.is_first_block == 0:\n",
    "            out = torch.cat((out, x_scales[self.scales-1]), 1)\n",
    "        elif self.scales != 1 and self.is_first_block == 1:\n",
    "            out = torch.cat((out, self.pool(x_scales[self.scales-1])), 1)\n",
    "\n",
    "        # 1*1卷积层\n",
    "        out = self.conv3(out)\n",
    "        out = self.bn3(out)\n",
    "\n",
    "        # 是否加入SE模块\n",
    "        if self.se is not None:\n",
    "            out = self.se(out)\n",
    "\n",
    "        # 添加triplet_attention\n",
    "\n",
    "        # 残差连接 out=F(X)+X\n",
    "        out += identity\n",
    "        #out = self.relu(out)\n",
    "        out = self.af(out)\n",
    "\n",
    "        return out\n",
    "\n",
    "\n",
    "class Res2Net(nn.Module):\n",
    "    def __init__(self, block, layers, num_classes=1000, scales=4, groups=1, se=True):\n",
    "        super(Res2Net, self).__init__()\n",
    "        # 通道数初始化\n",
    "        self.inplanes = 64\n",
    "\n",
    "        # 起始：7*7的卷积层，3*3的最大池化层\n",
    "        self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=3, stride=1, padding=1, bias=False)\n",
    "        self.bn1 = nn.BatchNorm2d(self.inplanes)\n",
    "        #self.relu = nn.ReLU(inplace=True)\n",
    "        if is_CELU:\n",
    "            self.af = nn.CELU(inplace=True)\n",
    "        elif is_ELU:\n",
    "            self.af = nn.ELU(inplace=True)\n",
    "        elif is_GELU:\n",
    "            self.af = nn.GELU()  # 添加 GELU 激活函数\n",
    "        else:\n",
    "            self.af = nn.ReLU(inplace=True)\n",
    "        \n",
    "        \n",
    "        #self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)\n",
    "\n",
    "        # 残差结构\n",
    "        self.layer1 = self._make_layer(block, 64, layers[0], stride=1, scales=scales, groups=groups, se=se)\n",
    "        self.layer2 = self._make_layer(block, 128, layers[1], stride=1, scales=scales, groups=groups, se=se)\n",
    "        self.layer3 = self._make_layer(block, 256, layers[2], stride=2, scales=scales, groups=groups, se=se)\n",
    "        self.layer4 = self._make_layer(block, 512, layers[3], stride=2, scales=scales, groups=groups, se=se)\n",
    "\n",
    "        # 平均池化+全连接层\n",
    "        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))\n",
    "        self.fc = nn.Linear(512 * block.expansion, num_classes)\n",
    "\n",
    "        # 权重初始化\n",
    "        for m in self.modules():\n",
    "            if isinstance(m, nn.Conv2d):\n",
    "                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')\n",
    "            elif isinstance(m, nn.BatchNorm2d):\n",
    "                nn.init.constant_(m.weight, 1)\n",
    "                nn.init.constant_(m.bias, 0)\n",
    "\n",
    "    def _make_layer(self, block, planes, layer, stride=1, scales=4, groups=1, se=True):\n",
    "        # 积步长不为1或深度扩张有变化，导致F(X)与X的shape不同的残差块，就要对X定义下采样函数，使之shape相同\n",
    "        downsample = None\n",
    "        if stride != 1 or self.inplanes != planes * block.expansion:\n",
    "            downsample = nn.Sequential(\n",
    "                nn.Conv2d(self.inplanes, planes * block.expansion, kernel_size=1, stride=stride, bias=False),\n",
    "                nn.BatchNorm2d(planes * block.expansion),\n",
    "            )\n",
    "\n",
    "        layers = []\n",
    "        # 第一个残差块需要下采样  def __init__(self, inplanes, planes, stride=1, downsample=None, scales=4, groups=1):\n",
    "        layers.append(block(self.inplanes, planes, stride=stride, downsample=downsample,\n",
    "                            scales=scales, groups=groups, is_first_block=1, se=se))\n",
    "        self.inplanes = planes * block.expansion\n",
    "\n",
    "        # 通过循环堆叠其余残差块\n",
    "        for i in range(1, layer):\n",
    "            layers.append(block(self.inplanes, planes, scales=scales, groups=groups, se=se))\n",
    "\n",
    "        return nn.Sequential(*layers)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = self.conv1(x)\n",
    "        x = self.bn1(x)\n",
    "        #x = self.relu(x)\n",
    "        x = self.af(x)\n",
    "        #x = self.maxpool(x)\n",
    "\n",
    "        x = self.layer1(x)\n",
    "        x = self.layer2(x)\n",
    "        x = self.layer3(x)\n",
    "        x = self.layer4(x)\n",
    "\n",
    "        x = self.avgpool(x)\n",
    "        x = torch.flatten(x, 1)\n",
    "        x = self.fc(x)\n",
    "\n",
    "        return x\n",
    "\n",
    "\n",
    "# def __init__(self, block, layers, num_classes=1000, scales=4, groups=1):\n",
    "def res2net50(num_classes=100, scales=4, groups=1, se=True):\n",
    "    return Res2Net(Bottleneck, [3, 4, 6, 3], num_classes, scales, groups, se)\n",
    "\n",
    "def res2net18(num_classes=100, scales=4, groups=1, se=True):\n",
    "    return Res2Net(Bottleneck, [2, 2, 2, 2], num_classes, scales, groups, se)\n",
    "\n",
    "\n",
    "def res2net101(num_classes=100, scales=4, groups=1):\n",
    "    return Res2Net(Bottleneck, [3, 4, 23, 3], num_classes, scales, groups)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "627b2efb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Res2Net(\n",
      "  (conv1): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "  (af): GELU(approximate='none')\n",
      "  (layer1): Sequential(\n",
      "    (0): Bottleneck(\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0-2): 3 x Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0-2): 3 x BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (af): GELU(approximate='none')\n",
      "      (pool): AvgPool2d(kernel_size=3, stride=1, padding=1)\n",
      "    )\n",
      "    (1): Bottleneck(\n",
      "      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0-2): 3 x Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0-2): 3 x BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (af): GELU(approximate='none')\n",
      "    )\n",
      "  )\n",
      "  (layer2): Sequential(\n",
      "    (0): Bottleneck(\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0-2): 3 x Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0-2): 3 x BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (af): GELU(approximate='none')\n",
      "      (pool): AvgPool2d(kernel_size=3, stride=1, padding=1)\n",
      "    )\n",
      "    (1): Bottleneck(\n",
      "      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0-2): 3 x Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0-2): 3 x BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (af): GELU(approximate='none')\n",
      "    )\n",
      "  )\n",
      "  (layer3): Sequential(\n",
      "    (0): Bottleneck(\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0-2): 3 x Conv2d(64, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0-2): 3 x BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (af): GELU(approximate='none')\n",
      "      (pool): AvgPool2d(kernel_size=3, stride=2, padding=1)\n",
      "    )\n",
      "    (1): Bottleneck(\n",
      "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0-2): 3 x Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0-2): 3 x BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (af): GELU(approximate='none')\n",
      "    )\n",
      "  )\n",
      "  (layer4): Sequential(\n",
      "    (0): Bottleneck(\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0-2): 3 x Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0-2): 3 x BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (af): GELU(approximate='none')\n",
      "      (pool): AvgPool2d(kernel_size=3, stride=2, padding=1)\n",
      "    )\n",
      "    (1): Bottleneck(\n",
      "      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): ModuleList(\n",
      "        (0-2): 3 x Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      )\n",
      "      (bn2): ModuleList(\n",
      "        (0-2): 3 x BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (af): GELU(approximate='none')\n",
      "    )\n",
      "  )\n",
      "  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "  (fc): Linear(in_features=2048, out_features=100, bias=True)\n",
      ")\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Res2Net(\n",
       "  (conv1): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "  (af): GELU(approximate='none')\n",
       "  (layer1): Sequential(\n",
       "    (0): Bottleneck(\n",
       "      (downsample): Sequential(\n",
       "        (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "      (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): ModuleList(\n",
       "        (0-2): 3 x Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      )\n",
       "      (bn2): ModuleList(\n",
       "        (0-2): 3 x BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (af): GELU(approximate='none')\n",
       "      (pool): AvgPool2d(kernel_size=3, stride=1, padding=1)\n",
       "    )\n",
       "    (1): Bottleneck(\n",
       "      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): ModuleList(\n",
       "        (0-2): 3 x Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      )\n",
       "      (bn2): ModuleList(\n",
       "        (0-2): 3 x BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (af): GELU(approximate='none')\n",
       "    )\n",
       "  )\n",
       "  (layer2): Sequential(\n",
       "    (0): Bottleneck(\n",
       "      (downsample): Sequential(\n",
       "        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "      (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): ModuleList(\n",
       "        (0-2): 3 x Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      )\n",
       "      (bn2): ModuleList(\n",
       "        (0-2): 3 x BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (af): GELU(approximate='none')\n",
       "      (pool): AvgPool2d(kernel_size=3, stride=1, padding=1)\n",
       "    )\n",
       "    (1): Bottleneck(\n",
       "      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): ModuleList(\n",
       "        (0-2): 3 x Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      )\n",
       "      (bn2): ModuleList(\n",
       "        (0-2): 3 x BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (af): GELU(approximate='none')\n",
       "    )\n",
       "  )\n",
       "  (layer3): Sequential(\n",
       "    (0): Bottleneck(\n",
       "      (downsample): Sequential(\n",
       "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
       "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "      (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): ModuleList(\n",
       "        (0-2): 3 x Conv2d(64, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
       "      )\n",
       "      (bn2): ModuleList(\n",
       "        (0-2): 3 x BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (af): GELU(approximate='none')\n",
       "      (pool): AvgPool2d(kernel_size=3, stride=2, padding=1)\n",
       "    )\n",
       "    (1): Bottleneck(\n",
       "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): ModuleList(\n",
       "        (0-2): 3 x Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      )\n",
       "      (bn2): ModuleList(\n",
       "        (0-2): 3 x BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (af): GELU(approximate='none')\n",
       "    )\n",
       "  )\n",
       "  (layer4): Sequential(\n",
       "    (0): Bottleneck(\n",
       "      (downsample): Sequential(\n",
       "        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
       "        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): ModuleList(\n",
       "        (0-2): 3 x Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
       "      )\n",
       "      (bn2): ModuleList(\n",
       "        (0-2): 3 x BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (af): GELU(approximate='none')\n",
       "      (pool): AvgPool2d(kernel_size=3, stride=2, padding=1)\n",
       "    )\n",
       "    (1): Bottleneck(\n",
       "      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): ModuleList(\n",
       "        (0-2): 3 x Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      )\n",
       "      (bn2): ModuleList(\n",
       "        (0-2): 3 x BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (af): GELU(approximate='none')\n",
       "    )\n",
       "  )\n",
       "  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n",
       "  (fc): Linear(in_features=2048, out_features=100, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = res2net18(se=False)\n",
    "#model = resnet18()\n",
    "print(model)\n",
    "\n",
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "#print(\"using {} device.\".format(device))\n",
    "\n",
    "model.to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "abcf60b1",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch.optim as optim\n",
    "from torch.optim import lr_scheduler\n",
    "#criterion = nn.CrossEntropyLoss().to(device)\n",
    "#optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9)\n",
    "\n",
    "#optimizer = optim.SGD(filter(lambda p: p.requires_grad, model.parameters()), lr=0.001, momentum=0.9, weight_decay=5e-4)\n",
    "#optimizer = torch.optim.Adam(net.parameters(), lr=0.0004)\n",
    "\n",
    "# 定义损失函数和优化器\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)\n",
    "scheduler = lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "a11bc3a3",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import os\n",
    "from thop import profile\n",
    "from torch.utils.data import DataLoader\n",
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "import numpy as np\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "import torch.optim as optim\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms\n",
    "def plot_training_results(train_losses, train_top1_accs, train_top5_accs, val_losses, val_top1_accs, val_top5_accs):\n",
    "    #device = torch.device(\"cpu\")\n",
    "    #print(\"using {} device.\".format(device))\n",
    "    # 将张量移动到CPU上并转换为NumPy数组\n",
    "    #train_losses_cpu = train_losses.cpu().numpy()\n",
    "    #val_losses_cpu = val_losses.cpu().numpy()\n",
    "    #train_top1_accs_cpu = train_top1_accs.cpu().numpy()\n",
    "    #val_top1_accs_cpu = val_top1_accs.cpu().numpy()\n",
    "    #train_top5_accs_cpu = train_top5_accs.cpu().numpy()\n",
    "    #val_top5_accs_cpu = val_top5_accs.cpu().numpy()\n",
    "\n",
    "    plt.figure(figsize=(15, 5))\n",
    "    # 绘制损失曲线\n",
    "    plt.subplot(1, 2, 1)\n",
    "    plt.plot(train_losses, label='Training Loss')\n",
    "    plt.plot(val_losses, label='Validation Loss')\n",
    "    plt.xlabel('Epoch')\n",
    "    plt.ylabel('Loss')\n",
    "    plt.title('Training/Validation Loss Curve')\n",
    "    plt.legend()\n",
    "\n",
    "    # 绘制准确率曲线\n",
    "    plt.subplot(1, 2, 2)\n",
    "    plt.plot(train_top1_accs, label='Training Top-1 Accuracy')\n",
    "    plt.plot(val_top1_accs, label='Validation Top-1 Accuracy')\n",
    "    plt.plot(train_top5_accs, label='Training Top-5 Accuracy')\n",
    "    plt.plot(val_top5_accs, label='Validation Top-5 Accuracy')\n",
    "    plt.xlabel('Epoch')\n",
    "    plt.ylabel('Accuracy')\n",
    "    plt.title('Training/Validation Accuracy Curve')\n",
    "    plt.legend()\n",
    "    \n",
    "    plt.tight_layout()\n",
    "    plt.show()\n",
    "\n",
    "def get_data_loaders(train_batch_size, test_batch_size,data_path,transform_train=None,transform_test=None):\n",
    "    #图像变换,预处理操作，\n",
    "    if transform_train==None:\n",
    "        transform_train=transforms.Compose([\n",
    "            transforms.RandomCrop(32, padding=4),\n",
    "            transforms.RandomHorizontalFlip(),\n",
    "            transforms.ToTensor(),\n",
    "            transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))\n",
    "        ])\n",
    "    if transform_test==None:\n",
    "        transform_test=transforms.Compose([\n",
    "            transforms.ToTensor(),\n",
    "            transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))\n",
    "        ])\n",
    "    train_data=torchvision.datasets.CIFAR100(root=data_path,train=True,download=False,transform=transform_train)\n",
    "    trainloader=torch.utils.data.DataLoader(train_data,batch_size=train_batch_size,shuffle=True,num_workers=0)\n",
    "    test_data=torchvision.datasets.CIFAR100(root=data_path,train=False,download=False,transform=transform_test)\n",
    "    testloader=torch.utils.data.DataLoader(test_data,batch_size=test_batch_size,shuffle=False,num_workers=0)\n",
    "\n",
    "    return trainloader,testloader\n",
    "\n",
    "def train(model,trainloader,criterion,optimizer,device):\n",
    "    model.train()\n",
    "    train_loss=0\n",
    "    correct=0\n",
    "    top5_correct=0\n",
    "    total=0\n",
    "    for batch_idx,(data,target) in enumerate(trainloader):\n",
    "        data,target=data.to(device),target.to(device)\n",
    "        optimizer.zero_grad()\n",
    "        output=model(data)\n",
    "        loss=criterion(output,target)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        train_loss+=loss.item()\n",
    "        _,predicted=output.max(1)\n",
    "        total+=target.size(0)\n",
    "        correct+=predicted.eq(target).sum().item()\n",
    "        _,top5_predicted=output.topk(5,1)\n",
    "        top5_correct+=top5_predicted.eq(target.view(-1,1).expand_as(top5_predicted)).sum().item()\n",
    "    return train_loss/(batch_idx+1),100.*correct/total,100.*top5_correct/total\n",
    "\n",
    "def test(model,testloader,criterion,device):\n",
    "    model.eval()\n",
    "    test_loss=0\n",
    "    correct=0\n",
    "    top5_correct=0\n",
    "    total=0\n",
    "    with torch.no_grad():\n",
    "        for batch_idx,(data,target) in enumerate(testloader):\n",
    "            data,target=data.to(device),target.to(device)\n",
    "            output=model(data)\n",
    "            loss=criterion(output,target)\n",
    "            test_loss+=loss.item()\n",
    "            _,predicted=output.max(1)\n",
    "            total+=target.size(0)\n",
    "            correct+=predicted.eq(target).sum().item()\n",
    "            _,top5_predicted=output.topk(5,1)\n",
    "            top5_correct+=top5_predicted.eq(target.view(-1,1).expand_as(top5_predicted)).sum().item()\n",
    "    return test_loss/(batch_idx+1),100.*correct/total,100.*top5_correct/total\n",
    "\n",
    "\n",
    "def save_log(modelname,train_acc,test_acc,train_loss,test_loss,train_top5_correct,test_top5_correct,output_dir='../train_process'):\n",
    "    if modelname==None:\n",
    "        modelname='unnamed model'\n",
    "    output_dir=output_dir+'/'+modelname\n",
    "    # Create directory if it doesn't exist.\n",
    "    if not os.path.exists(output_dir):\n",
    "        os.makedirs(output_dir)\n",
    "    # Accuracy plots.\n",
    "    with open(os.path.join(output_dir, \"train_log.txt\"),'w') as f:\n",
    "        for i in range(len(train_acc)):\n",
    "            f.write('epoch:{} train_acc:{} test_acc:{} train_loss:{} test_loss:{} train_top5_correct:{} test_top5_correct:{}\\n'.format(i,train_acc[i],test_acc[i],train_loss[i],test_loss[i],train_top5_correct[i],test_top5_correct[i]))\n",
    "\n",
    "def save_model_info(modelname,model,train_acc,test_acc,train_loss,test_loss,train_top5_correct,test_top5_correct,learning_rate,epochnum,momentum,weight_decay,output_dir='../train_process'):\n",
    "    if modelname==None:\n",
    "        modelname='unnamed model'\n",
    "    output_dir=output_dir+'/'+modelname\n",
    "    # Create directory if it doesn't exist.\n",
    "    if not os.path.exists(output_dir):\n",
    "        os.makedirs(output_dir)\n",
    "    # Accuracy plots.\n",
    "    with open(os.path.join(output_dir, \"model_info.txt\"),'w') as f:\n",
    "        input = torch.randn(1, 3, 32, 32).to('cuda')\n",
    "        Flops, params = profile(model, inputs=(input,)) # macs\n",
    "        f.write('Flops:{} params:{}\\n'.format(Flops,params))\n",
    "        f.write('learning_rate:{} epochnum:{} momentum:{} weight_decay:{}\\n'.format(learning_rate,epochnum,momentum,weight_decay))\n",
    "        f.write('train_acc:{} test_acc:{} train_loss:{} test_loss:{} train_top5_correct:{} test_top5_correct:{}\\n'.format(train_acc[-1],test_acc[-1],train_loss[-1],test_loss[-1],train_top5_correct[-1],test_top5_correct[-1]))\n",
    "\n",
    "def check_model_info(model):\n",
    "    device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "    input = torch.randn(1, 3, 32, 32).to(device)\n",
    "    Flops, params = profile(model, inputs=(input,))  # macs\n",
    "    print('Flops:{} params:{}\\n'.format(Flops, params))\n",
    "\n",
    "\n",
    "#######用于输出前五和后五类的函数#########\n",
    "def test_model(model, testloader,device='cuda'):\n",
    "    \n",
    "    class_correct = list(0. for _ in range(100))\n",
    "    class_total = list(0. for _ in range(100))\n",
    "    loss_min=list(999. for _ in range(100))\n",
    "    loss_max=list(0. for _ in range(100))\n",
    "    image_min={}\n",
    "    image_max={}\n",
    "    with torch.no_grad():\n",
    "        for data in testloader:\n",
    "            inputs, labels = data\n",
    "            inputs, labels = inputs.to(device), labels.to(device)\n",
    "            outputs = model(inputs)\n",
    "            loss = F.cross_entropy(outputs, labels)\n",
    "            if loss<loss_min[int(labels)]:\n",
    "                loss_min[int(labels)]=loss\n",
    "                image_min[int(labels)]=inputs\n",
    "            if loss>loss_max[int(labels)]:\n",
    "                loss_max[int(labels)]=loss\n",
    "                image_max[int(labels)]=inputs\n",
    "            _, predicted = torch.max(outputs, 1)\n",
    "            c = (predicted == labels).squeeze()\n",
    "            class_correct[int(labels)] += c.item()\n",
    "            class_total[int(labels)] += 1\n",
    "\n",
    "    accuracy = [100 * class_correct[i] / class_total[i] for i in range(100)]\n",
    "    sorted_classes = np.argsort(accuracy)\n",
    "    best_classes = sorted_classes[-5:]\n",
    "    worst_classes = sorted_classes[:5]\n",
    "\n",
    "    return best_classes, worst_classes, loss_min, loss_max, image_min, image_max,accuracy\n",
    "\n",
    "\n",
    "def show_best5_worst5(model,data_path,device='cuda'):\n",
    "    '''\n",
    "    用于输出前五和后五类的函数\n",
    "    :param model: 模型\n",
    "    :param data_path: 数据集路径\n",
    "    :param device: 训练设备\n",
    "    用例：\n",
    "    model=ResNet(BasicBlock_v2,[2,2,2,2],num_classes=100)\n",
    "    model.load_state_dict(torch.load('ResNet_no_downepoch=150.pth',map_location='cuda'))\n",
    "    model=model.to('cuda')\n",
    "    show_best5_worst5(model,'E:/深度学习/ResNet18_from_Scratch_using_PyTorch/data',device='cuda')\n",
    "    '''\n",
    "    _,testloader=get_data_loaders(train_batch_size=128,test_batch_size=1,data_path=data_path)\n",
    "    best_classes, worst_classes, loss_min, loss_max, image_min, image_max,accuracy = test_model(model, testloader,device)\n",
    "    for bc in best_classes:\n",
    "        print(\"Class {} Accuracy: {:.2f}%\".format(bc, accuracy[bc]))\n",
    "        #输出对应图片和他的损失\n",
    "        imag=image_min[bc].permute(0,2, 3, 1)[0].cpu()\n",
    "        \n",
    "        plt.imshow(imag)\n",
    "        plt.show()\n",
    "        print(\"Loss: {:.4f}\".format(loss_min[bc]))\n",
    "    for wc in worst_classes:\n",
    "        print(\"Class {} Accuracy: {:.2f}%\".format(wc, accuracy[wc]))\n",
    "        #输出对应图片和他的损失\n",
    "        imag=image_max[wc].permute(0,2, 3, 1)[0].cpu()\n",
    "        plt.imshow(imag)\n",
    "        plt.show()\n",
    "        print(\"Loss: {:.4f}\".format(loss_max[wc]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "299e1ca1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 训练模型\n",
    "def train_model(model, criterion, optimizer, scheduler, num_epochs=25):\n",
    "    since = time.time()\n",
    "\n",
    "    best_model_wts = copy.deepcopy(model.state_dict())\n",
    "    best_acc = 0.0\n",
    " \n",
    "    for epoch in range(num_epochs):\n",
    "        print('第 {}/{} 轮训练'.format(epoch, num_epochs - 1))\n",
    "        print('-' * 10)\n",
    "\n",
    "        # 每个epoch都有训练和验证阶段\n",
    "        for phase in ['train', 'val']:\n",
    "            if phase == 'train':\n",
    "                model.train()  # 设置模型为训练模式\n",
    "            else:\n",
    "                model.eval()   # 设置模型为评估模式\n",
    "\n",
    "            running_loss = 0.0\n",
    "            running_corrects = 0\n",
    "            running_top1_corrects = 0\n",
    "            running_top5_corrects = 0\n",
    "\n",
    "            # 遍历数据\n",
    "            for inputs, labels in (trainloader if phase == 'train' else testloader):\n",
    "                inputs = inputs.to(device)\n",
    "                labels = labels.to(device)\n",
    "\n",
    "                # 零化参数梯度\n",
    "                optimizer.zero_grad()\n",
    "\n",
    "                # 前向传播\n",
    "                # 只在训练阶段追踪历史\n",
    "                with torch.set_grad_enabled(phase == 'train'):\n",
    "                    outputs = model(inputs)\n",
    "                    _, preds = torch.max(outputs, 1)\n",
    "                    loss = criterion(outputs, labels)\n",
    "\n",
    "                    # 计算 top-1 和 top-5 准确率\n",
    "                    _, top5_preds = torch.topk(outputs, 5, dim=1)\n",
    "                    top1_correct = torch.sum(preds == labels.data)\n",
    "                    top5_correct = torch.sum(top5_preds == labels.view(-1, 1))\n",
    "\n",
    "                    # 只有在训练阶段反向传播+优化\n",
    "                    if phase == 'train':\n",
    "                        loss.backward()\n",
    "                        optimizer.step()\n",
    "\n",
    "                # 统计\n",
    "                running_loss += loss.item() * inputs.size(0)\n",
    "                running_corrects += top1_correct\n",
    "                running_top1_corrects += top1_correct\n",
    "                running_top5_corrects += top5_correct\n",
    "\n",
    "            if phase == 'train':\n",
    "                scheduler.step()\n",
    "\n",
    "            epoch_loss = running_loss / len(trainloader.dataset if phase == 'train' else testloader.dataset)\n",
    "            epoch_top1_acc = running_top1_corrects.double() / len(trainloader.dataset if phase == 'train' else testloader.dataset)\n",
    "            epoch_top5_acc = running_top5_corrects.double() / len(trainloader.dataset if phase == 'train' else testloader.dataset)\n",
    "\n",
    "            print('{} 损失: {:.4f} Top-1 准确率: {:.4f} Top-5 准确率: {:.4f}'.format(\n",
    "                phase, epoch_loss, epoch_top1_acc, epoch_top5_acc))\n",
    "            \n",
    "            # 保存损失和准确率\n",
    "            if phase == 'train':\n",
    "                train_losses.append(epoch_loss)\n",
    "                train_top1_accs.append(epoch_top1_acc)\n",
    "                train_top5_accs.append(epoch_top5_acc)\n",
    "            else:\n",
    "                val_losses.append(epoch_loss)\n",
    "                val_top1_accs.append(epoch_top1_acc)\n",
    "                val_top5_accs.append(epoch_top5_acc)\n",
    "\n",
    "            # 深度复制模型\n",
    "            if phase == 'val' and epoch_top1_acc > best_acc:\n",
    "                best_acc = epoch_top1_acc\n",
    "                best_model_wts = copy.deepcopy(model.state_dict())\n",
    "\n",
    "        print()\n",
    "\n",
    "    time_elapsed = time.time() - since\n",
    "    print('训练完成，耗时 {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))\n",
    "    print('训练完成，耗时 {:.0f}小时 {:.0f}分钟'.format(time_elapsed // 3600, (time_elapsed % 3600) // 60))\n",
    "    print('最佳验证集准确率: {:4f}'.format(best_acc))\n",
    "\n",
    "    # 加载最佳模型权重\n",
    "    model.load_state_dict(best_model_wts)\n",
    "    \n",
    "    # 绘制训练结果曲线\n",
    "\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "23014d4c",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_losses = []\n",
    "train_top1_accs = []\n",
    "train_top5_accs = []\n",
    "val_losses = []\n",
    "val_top1_accs = []\n",
    "val_top5_accs = []\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "2dd73cee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第 0/99 轮训练\n",
      "----------\n",
      "train 损失: 3.7203 Top-1 准确率: 0.1324 Top-5 准确率: 0.3619\n",
      "val 损失: 3.4944 Top-1 准确率: 0.1775 Top-5 准确率: 0.4498\n",
      "\n",
      "第 1/99 轮训练\n",
      "----------\n",
      "train 损失: 3.0648 Top-1 准确率: 0.2394 Top-5 准确率: 0.5394\n",
      "val 损失: 2.9897 Top-1 准确率: 0.2718 Top-5 准确率: 0.5736\n",
      "\n",
      "第 2/99 轮训练\n",
      "----------\n",
      "train 损失: 2.7073 Top-1 准确率: 0.3098 Top-5 准确率: 0.6298\n",
      "val 损失: 2.7090 Top-1 准确率: 0.3241 Top-5 准确率: 0.6420\n",
      "\n",
      "第 3/99 轮训练\n",
      "----------\n",
      "train 损失: 2.4587 Top-1 准确率: 0.3594 Top-5 准确率: 0.6830\n",
      "val 损失: 2.5407 Top-1 准确率: 0.3573 Top-5 准确率: 0.6846\n",
      "\n",
      "第 4/99 轮训练\n",
      "----------\n",
      "train 损失: 2.2577 Top-1 准确率: 0.4000 Top-5 准确率: 0.7271\n",
      "val 损失: 2.3768 Top-1 准确率: 0.3995 Top-5 准确率: 0.7146\n",
      "\n",
      "第 5/99 轮训练\n",
      "----------\n",
      "train 损失: 2.0951 Top-1 准确率: 0.4379 Top-5 准确率: 0.7587\n",
      "val 损失: 2.2628 Top-1 准确率: 0.4178 Top-5 准确率: 0.7385\n",
      "\n",
      "第 6/99 轮训练\n",
      "----------\n",
      "train 损失: 1.9809 Top-1 准确率: 0.4619 Top-5 准确率: 0.7835\n",
      "val 损失: 2.2061 Top-1 准确率: 0.4307 Top-5 准确率: 0.7554\n",
      "\n",
      "第 7/99 轮训练\n",
      "----------\n",
      "train 损失: 1.8766 Top-1 准确率: 0.4892 Top-5 准确率: 0.8018\n",
      "val 损失: 2.0193 Top-1 准确率: 0.4650 Top-5 准确率: 0.7819\n",
      "\n",
      "第 8/99 轮训练\n",
      "----------\n",
      "train 损失: 1.7860 Top-1 准确率: 0.5091 Top-5 准确率: 0.8162\n",
      "val 损失: 2.0254 Top-1 准确率: 0.4677 Top-5 准确率: 0.7765\n",
      "\n",
      "第 9/99 轮训练\n",
      "----------\n",
      "train 损失: 1.7045 Top-1 准确率: 0.5285 Top-5 准确率: 0.8308\n",
      "val 损失: 1.8887 Top-1 准确率: 0.4983 Top-5 准确率: 0.8041\n",
      "\n",
      "第 10/99 轮训练\n",
      "----------\n",
      "train 损失: 1.6415 Top-1 准确率: 0.5426 Top-5 准确率: 0.8425\n",
      "val 损失: 1.7932 Top-1 准确率: 0.5236 Top-5 准确率: 0.8166\n",
      "\n",
      "第 11/99 轮训练\n",
      "----------\n",
      "train 损失: 1.5757 Top-1 准确率: 0.5602 Top-5 准确率: 0.8501\n",
      "val 损失: 1.7885 Top-1 准确率: 0.5224 Top-5 准确率: 0.8205\n",
      "\n",
      "第 12/99 轮训练\n",
      "----------\n",
      "train 损失: 1.5204 Top-1 准确率: 0.5724 Top-5 准确率: 0.8603\n",
      "val 损失: 1.7678 Top-1 准确率: 0.5316 Top-5 准确率: 0.8254\n",
      "\n",
      "第 13/99 轮训练\n",
      "----------\n",
      "train 损失: 1.4707 Top-1 准确率: 0.5832 Top-5 准确率: 0.8698\n",
      "val 损失: 1.7491 Top-1 准确率: 0.5425 Top-5 准确率: 0.8264\n",
      "\n",
      "第 14/99 轮训练\n",
      "----------\n",
      "train 损失: 1.4208 Top-1 准确率: 0.5988 Top-5 准确率: 0.8742\n",
      "val 损失: 1.6573 Top-1 准确率: 0.5526 Top-5 准确率: 0.8361\n",
      "\n",
      "第 15/99 轮训练\n",
      "----------\n",
      "train 损失: 1.3812 Top-1 准确率: 0.6070 Top-5 准确率: 0.8822\n",
      "val 损失: 1.6988 Top-1 准确率: 0.5510 Top-5 准确率: 0.8360\n",
      "\n",
      "第 16/99 轮训练\n",
      "----------\n",
      "train 损失: 1.3409 Top-1 准确率: 0.6171 Top-5 准确率: 0.8890\n",
      "val 损失: 1.5770 Top-1 准确率: 0.5682 Top-5 准确率: 0.8540\n",
      "\n",
      "第 17/99 轮训练\n",
      "----------\n",
      "train 损失: 1.3135 Top-1 准确率: 0.6258 Top-5 准确率: 0.8932\n",
      "val 损失: 1.5305 Top-1 准确率: 0.5805 Top-5 准确率: 0.8593\n",
      "\n",
      "第 18/99 轮训练\n",
      "----------\n",
      "train 损失: 1.2789 Top-1 准确率: 0.6338 Top-5 准确率: 0.8981\n",
      "val 损失: 1.5904 Top-1 准确率: 0.5775 Top-5 准确率: 0.8530\n",
      "\n",
      "第 19/99 轮训练\n",
      "----------\n",
      "train 损失: 1.2424 Top-1 准确率: 0.6426 Top-5 准确率: 0.9020\n",
      "val 损失: 1.5584 Top-1 准确率: 0.5777 Top-5 准确率: 0.8612\n",
      "\n",
      "第 20/99 轮训练\n",
      "----------\n",
      "train 损失: 1.2133 Top-1 准确率: 0.6505 Top-5 准确率: 0.9055\n",
      "val 损失: 1.5580 Top-1 准确率: 0.5764 Top-5 准确率: 0.8607\n",
      "\n",
      "第 21/99 轮训练\n",
      "----------\n",
      "train 损失: 1.1895 Top-1 准确率: 0.6558 Top-5 准确率: 0.9090\n",
      "val 损失: 1.5315 Top-1 准确率: 0.5842 Top-5 准确率: 0.8628\n",
      "\n",
      "第 22/99 轮训练\n",
      "----------\n",
      "train 损失: 1.1644 Top-1 准确率: 0.6630 Top-5 准确率: 0.9126\n",
      "val 损失: 1.5806 Top-1 准确率: 0.5804 Top-5 准确率: 0.8548\n",
      "\n",
      "第 23/99 轮训练\n",
      "----------\n",
      "train 损失: 1.1466 Top-1 准确率: 0.6675 Top-5 准确率: 0.9160\n",
      "val 损失: 1.5662 Top-1 准确率: 0.5819 Top-5 准确率: 0.8589\n",
      "\n",
      "第 24/99 轮训练\n",
      "----------\n",
      "train 损失: 1.1204 Top-1 准确率: 0.6743 Top-5 准确率: 0.9181\n",
      "val 损失: 1.4539 Top-1 准确率: 0.6060 Top-5 准确率: 0.8734\n",
      "\n",
      "第 25/99 轮训练\n",
      "----------\n",
      "train 损失: 1.0998 Top-1 准确率: 0.6799 Top-5 准确率: 0.9223\n",
      "val 损失: 1.4520 Top-1 准确率: 0.6107 Top-5 准确率: 0.8747\n",
      "\n",
      "第 26/99 轮训练\n",
      "----------\n",
      "train 损失: 1.0839 Top-1 准确率: 0.6832 Top-5 准确率: 0.9223\n",
      "val 损失: 1.4648 Top-1 准确率: 0.6057 Top-5 准确率: 0.8726\n",
      "\n",
      "第 27/99 轮训练\n",
      "----------\n",
      "train 损失: 1.0618 Top-1 准确率: 0.6900 Top-5 准确率: 0.9257\n",
      "val 损失: 1.3437 Top-1 准确率: 0.6281 Top-5 准确率: 0.8885\n",
      "\n",
      "第 28/99 轮训练\n",
      "----------\n",
      "train 损失: 1.0468 Top-1 准确率: 0.6923 Top-5 准确率: 0.9267\n",
      "val 损失: 1.3974 Top-1 准确率: 0.6183 Top-5 准确率: 0.8831\n",
      "\n",
      "第 29/99 轮训练\n",
      "----------\n",
      "train 损失: 1.0385 Top-1 准确率: 0.6966 Top-5 准确率: 0.9294\n",
      "val 损失: 1.5034 Top-1 准确率: 0.6040 Top-5 准确率: 0.8655\n",
      "\n",
      "第 30/99 轮训练\n",
      "----------\n",
      "train 损失: 1.0158 Top-1 准确率: 0.7022 Top-5 准确率: 0.9317\n",
      "val 损失: 1.3596 Top-1 准确率: 0.6246 Top-5 准确率: 0.8883\n",
      "\n",
      "第 31/99 轮训练\n",
      "----------\n",
      "train 损失: 0.9987 Top-1 准确率: 0.7074 Top-5 准确率: 0.9340\n",
      "val 损失: 1.4129 Top-1 准确率: 0.6200 Top-5 准确率: 0.8759\n",
      "\n",
      "第 32/99 轮训练\n",
      "----------\n",
      "train 损失: 0.9920 Top-1 准确率: 0.7103 Top-5 准确率: 0.9338\n",
      "val 损失: 1.3793 Top-1 准确率: 0.6281 Top-5 准确率: 0.8854\n",
      "\n",
      "第 33/99 轮训练\n",
      "----------\n",
      "train 损失: 0.9786 Top-1 准确率: 0.7105 Top-5 准确率: 0.9374\n",
      "val 损失: 1.3612 Top-1 准确率: 0.6275 Top-5 准确率: 0.8862\n",
      "\n",
      "第 34/99 轮训练\n",
      "----------\n",
      "train 损失: 0.9737 Top-1 准确率: 0.7131 Top-5 准确率: 0.9363\n",
      "val 损失: 1.3525 Top-1 准确率: 0.6274 Top-5 准确率: 0.8855\n",
      "\n",
      "第 35/99 轮训练\n",
      "----------\n",
      "train 损失: 0.9466 Top-1 准确率: 0.7222 Top-5 准确率: 0.9402\n",
      "val 损失: 1.3116 Top-1 准确率: 0.6363 Top-5 准确率: 0.8916\n",
      "\n",
      "第 36/99 轮训练\n",
      "----------\n",
      "train 损失: 0.9451 Top-1 准确率: 0.7213 Top-5 准确率: 0.9400\n",
      "val 损失: 1.3349 Top-1 准确率: 0.6405 Top-5 准确率: 0.8883\n",
      "\n",
      "第 37/99 轮训练\n",
      "----------\n",
      "train 损失: 0.9332 Top-1 准确率: 0.7232 Top-5 准确率: 0.9422\n",
      "val 损失: 1.2567 Top-1 准确率: 0.6525 Top-5 准确率: 0.9005\n",
      "\n",
      "第 38/99 轮训练\n",
      "----------\n",
      "train 损失: 0.9222 Top-1 准确率: 0.7272 Top-5 准确率: 0.9428\n",
      "val 损失: 1.3885 Top-1 准确率: 0.6262 Top-5 准确率: 0.8842\n",
      "\n",
      "第 39/99 轮训练\n",
      "----------\n",
      "train 损失: 0.9171 Top-1 准确率: 0.7268 Top-5 准确率: 0.9439\n",
      "val 损失: 1.3118 Top-1 准确率: 0.6437 Top-5 准确率: 0.8955\n",
      "\n",
      "第 40/99 轮训练\n",
      "----------\n",
      "train 损失: 0.9012 Top-1 准确率: 0.7318 Top-5 准确率: 0.9462\n",
      "val 损失: 1.2654 Top-1 准确率: 0.6492 Top-5 准确率: 0.8990\n",
      "\n",
      "第 41/99 轮训练\n",
      "----------\n",
      "train 损失: 0.8920 Top-1 准确率: 0.7329 Top-5 准确率: 0.9466\n",
      "val 损失: 1.2665 Top-1 准确率: 0.6478 Top-5 准确率: 0.8985\n",
      "\n",
      "第 42/99 轮训练\n",
      "----------\n",
      "train 损失: 0.8861 Top-1 准确率: 0.7361 Top-5 准确率: 0.9472\n",
      "val 损失: 1.2498 Top-1 准确率: 0.6516 Top-5 准确率: 0.9051\n",
      "\n",
      "第 43/99 轮训练\n",
      "----------\n",
      "train 损失: 0.8748 Top-1 准确率: 0.7410 Top-5 准确率: 0.9487\n",
      "val 损失: 1.2914 Top-1 准确率: 0.6473 Top-5 准确率: 0.8989\n",
      "\n",
      "第 44/99 轮训练\n",
      "----------\n",
      "train 损失: 0.8630 Top-1 准确率: 0.7442 Top-5 准确率: 0.9491\n",
      "val 损失: 1.2370 Top-1 准确率: 0.6608 Top-5 准确率: 0.8994\n",
      "\n",
      "第 45/99 轮训练\n",
      "----------\n",
      "train 损失: 0.8620 Top-1 准确率: 0.7425 Top-5 准确率: 0.9499\n",
      "val 损失: 1.2252 Top-1 准确率: 0.6652 Top-5 准确率: 0.9002\n",
      "\n",
      "第 46/99 轮训练\n",
      "----------\n",
      "train 损失: 0.8421 Top-1 准确率: 0.7491 Top-5 准确率: 0.9519\n",
      "val 损失: 1.2981 Top-1 准确率: 0.6468 Top-5 准确率: 0.8982\n",
      "\n",
      "第 47/99 轮训练\n",
      "----------\n",
      "train 损失: 0.8470 Top-1 准确率: 0.7475 Top-5 准确率: 0.9519\n",
      "val 损失: 1.2981 Top-1 准确率: 0.6436 Top-5 准确率: 0.8931\n",
      "\n",
      "第 48/99 轮训练\n",
      "----------\n",
      "train 损失: 0.8360 Top-1 准确率: 0.7491 Top-5 准确率: 0.9528\n",
      "val 损失: 1.2476 Top-1 准确率: 0.6540 Top-5 准确率: 0.8970\n",
      "\n",
      "第 49/99 轮训练\n",
      "----------\n",
      "train 损失: 0.8349 Top-1 准确率: 0.7512 Top-5 准确率: 0.9532\n",
      "val 损失: 1.2803 Top-1 准确率: 0.6504 Top-5 准确率: 0.8984\n",
      "\n",
      "第 50/99 轮训练\n",
      "----------\n",
      "train 损失: 0.5705 Top-1 准确率: 0.8367 Top-5 准确率: 0.9768\n",
      "val 损失: 0.9415 Top-1 准确率: 0.7277 Top-5 准确率: 0.9342\n",
      "\n",
      "第 51/99 轮训练\n",
      "----------\n",
      "train 损失: 0.4966 Top-1 准确率: 0.8602 Top-5 准确率: 0.9823\n",
      "val 损失: 0.9302 Top-1 准确率: 0.7337 Top-5 准确率: 0.9369\n",
      "\n",
      "第 52/99 轮训练\n",
      "----------\n",
      "train 损失: 0.4735 Top-1 准确率: 0.8695 Top-5 准确率: 0.9842\n",
      "val 损失: 0.9313 Top-1 准确率: 0.7329 Top-5 准确率: 0.9368\n",
      "\n",
      "第 53/99 轮训练\n",
      "----------\n",
      "train 损失: 0.4542 Top-1 准确率: 0.8745 Top-5 准确率: 0.9853\n",
      "val 损失: 0.9288 Top-1 准确率: 0.7325 Top-5 准确率: 0.9374\n",
      "\n",
      "第 54/99 轮训练\n",
      "----------\n",
      "train 损失: 0.4415 Top-1 准确率: 0.8787 Top-5 准确率: 0.9864\n",
      "val 损失: 0.9244 Top-1 准确率: 0.7387 Top-5 准确率: 0.9371\n",
      "\n",
      "第 55/99 轮训练\n",
      "----------\n",
      "train 损失: 0.4329 Top-1 准确率: 0.8805 Top-5 准确率: 0.9876\n",
      "val 损失: 0.9209 Top-1 准确率: 0.7372 Top-5 准确率: 0.9372\n",
      "\n",
      "第 56/99 轮训练\n",
      "----------\n",
      "train 损失: 0.4225 Top-1 准确率: 0.8843 Top-5 准确率: 0.9879\n",
      "val 损失: 0.9334 Top-1 准确率: 0.7364 Top-5 准确率: 0.9356\n",
      "\n",
      "第 57/99 轮训练\n",
      "----------\n",
      "train 损失: 0.4138 Top-1 准确率: 0.8862 Top-5 准确率: 0.9887\n",
      "val 损失: 0.9365 Top-1 准确率: 0.7349 Top-5 准确率: 0.9364\n",
      "\n",
      "第 58/99 轮训练\n",
      "----------\n",
      "train 损失: 0.4047 Top-1 准确率: 0.8901 Top-5 准确率: 0.9886\n",
      "val 损失: 0.9370 Top-1 准确率: 0.7350 Top-5 准确率: 0.9353\n",
      "\n",
      "第 59/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3986 Top-1 准确率: 0.8902 Top-5 准确率: 0.9895\n",
      "val 损失: 0.9405 Top-1 准确率: 0.7350 Top-5 准确率: 0.9368\n",
      "\n",
      "第 60/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3913 Top-1 准确率: 0.8931 Top-5 准确率: 0.9897\n",
      "val 损失: 0.9345 Top-1 准确率: 0.7370 Top-5 准确率: 0.9358\n",
      "\n",
      "第 61/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3847 Top-1 准确率: 0.8962 Top-5 准确率: 0.9903\n",
      "val 损失: 0.9398 Top-1 准确率: 0.7362 Top-5 准确率: 0.9377\n",
      "\n",
      "第 62/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3791 Top-1 准确率: 0.8976 Top-5 准确率: 0.9904\n",
      "val 损失: 0.9384 Top-1 准确率: 0.7350 Top-5 准确率: 0.9363\n",
      "\n",
      "第 63/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3736 Top-1 准确率: 0.8988 Top-5 准确率: 0.9903\n",
      "val 损失: 0.9461 Top-1 准确率: 0.7331 Top-5 准确率: 0.9362\n",
      "\n",
      "第 64/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3669 Top-1 准确率: 0.9016 Top-5 准确率: 0.9911\n",
      "val 损失: 0.9510 Top-1 准确率: 0.7335 Top-5 准确率: 0.9346\n",
      "\n",
      "第 65/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3621 Top-1 准确率: 0.9023 Top-5 准确率: 0.9918\n",
      "val 损失: 0.9425 Top-1 准确率: 0.7362 Top-5 准确率: 0.9366\n",
      "\n",
      "第 66/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3559 Top-1 准确率: 0.9046 Top-5 准确率: 0.9919\n",
      "val 损失: 0.9515 Top-1 准确率: 0.7365 Top-5 准确率: 0.9356\n",
      "\n",
      "第 67/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3474 Top-1 准确率: 0.9085 Top-5 准确率: 0.9926\n",
      "val 损失: 0.9448 Top-1 准确率: 0.7361 Top-5 准确率: 0.9371\n",
      "\n",
      "第 68/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3457 Top-1 准确率: 0.9071 Top-5 准确率: 0.9928\n",
      "val 损失: 0.9502 Top-1 准确率: 0.7358 Top-5 准确率: 0.9343\n",
      "\n",
      "第 69/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3382 Top-1 准确率: 0.9112 Top-5 准确率: 0.9933\n",
      "val 损失: 0.9543 Top-1 准确率: 0.7361 Top-5 准确率: 0.9361\n",
      "\n",
      "第 70/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3351 Top-1 准确率: 0.9109 Top-5 准确率: 0.9933\n",
      "val 损失: 0.9601 Top-1 准确率: 0.7342 Top-5 准确率: 0.9331\n",
      "\n",
      "第 71/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3293 Top-1 准确率: 0.9126 Top-5 准确率: 0.9934\n",
      "val 损失: 0.9532 Top-1 准确率: 0.7393 Top-5 准确率: 0.9330\n",
      "\n",
      "第 72/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3241 Top-1 准确率: 0.9143 Top-5 准确率: 0.9941\n",
      "val 损失: 0.9550 Top-1 准确率: 0.7392 Top-5 准确率: 0.9360\n",
      "\n",
      "第 73/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3197 Top-1 准确率: 0.9153 Top-5 准确率: 0.9942\n",
      "val 损失: 0.9686 Top-1 准确率: 0.7361 Top-5 准确率: 0.9349\n",
      "\n",
      "第 74/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3145 Top-1 准确率: 0.9182 Top-5 准确率: 0.9943\n",
      "val 损失: 0.9731 Top-1 准确率: 0.7350 Top-5 准确率: 0.9338\n",
      "\n",
      "第 75/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3106 Top-1 准确率: 0.9189 Top-5 准确率: 0.9945\n",
      "val 损失: 0.9602 Top-1 准确率: 0.7354 Top-5 准确率: 0.9348\n",
      "\n",
      "第 76/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3071 Top-1 准确率: 0.9195 Top-5 准确率: 0.9948\n",
      "val 损失: 0.9669 Top-1 准确率: 0.7360 Top-5 准确率: 0.9351\n",
      "\n",
      "第 77/99 轮训练\n",
      "----------\n",
      "train 损失: 0.3022 Top-1 准确率: 0.9215 Top-5 准确率: 0.9948\n",
      "val 损失: 0.9714 Top-1 准确率: 0.7319 Top-5 准确率: 0.9333\n",
      "\n",
      "第 78/99 轮训练\n",
      "----------\n",
      "train 损失: 0.2960 Top-1 准确率: 0.9236 Top-5 准确率: 0.9952\n",
      "val 损失: 0.9766 Top-1 准确率: 0.7355 Top-5 准确率: 0.9319\n",
      "\n",
      "第 79/99 轮训练\n",
      "----------\n",
      "train 损失: 0.2930 Top-1 准确率: 0.9236 Top-5 准确率: 0.9955\n",
      "val 损失: 0.9788 Top-1 准确率: 0.7326 Top-5 准确率: 0.9346\n",
      "\n",
      "第 80/99 轮训练\n",
      "----------\n",
      "train 损失: 0.2901 Top-1 准确率: 0.9259 Top-5 准确率: 0.9961\n",
      "val 损失: 0.9813 Top-1 准确率: 0.7324 Top-5 准确率: 0.9331\n",
      "\n",
      "第 81/99 轮训练\n",
      "----------\n",
      "train 损失: 0.2834 Top-1 准确率: 0.9266 Top-5 准确率: 0.9960\n",
      "val 损失: 0.9939 Top-1 准确率: 0.7343 Top-5 准确率: 0.9310\n",
      "\n",
      "第 82/99 轮训练\n",
      "----------\n",
      "train 损失: 0.2808 Top-1 准确率: 0.9279 Top-5 准确率: 0.9958\n",
      "val 损失: 0.9892 Top-1 准确率: 0.7337 Top-5 准确率: 0.9331\n",
      "\n",
      "第 83/99 轮训练\n",
      "----------\n",
      "train 损失: 0.2773 Top-1 准确率: 0.9297 Top-5 准确率: 0.9961\n",
      "val 损失: 0.9865 Top-1 准确率: 0.7327 Top-5 准确率: 0.9342\n",
      "\n",
      "第 84/99 轮训练\n",
      "----------\n",
      "train 损失: 0.2734 Top-1 准确率: 0.9317 Top-5 准确率: 0.9965\n",
      "val 损失: 1.0069 Top-1 准确率: 0.7303 Top-5 准确率: 0.9346\n",
      "\n",
      "第 85/99 轮训练\n",
      "----------\n",
      "train 损失: 0.2685 Top-1 准确率: 0.9327 Top-5 准确率: 0.9964\n",
      "val 损失: 0.9991 Top-1 准确率: 0.7302 Top-5 准确率: 0.9317\n",
      "\n",
      "第 86/99 轮训练\n",
      "----------\n",
      "train 损失: 0.2662 Top-1 准确率: 0.9344 Top-5 准确率: 0.9962\n",
      "val 损失: 0.9951 Top-1 准确率: 0.7308 Top-5 准确率: 0.9335\n",
      "\n",
      "第 87/99 轮训练\n",
      "----------\n",
      "train 损失: 0.2612 Top-1 准确率: 0.9340 Top-5 准确率: 0.9970\n",
      "val 损失: 0.9989 Top-1 准确率: 0.7317 Top-5 准确率: 0.9342\n",
      "\n",
      "第 88/99 轮训练\n",
      "----------\n",
      "train 损失: 0.2578 Top-1 准确率: 0.9367 Top-5 准确率: 0.9973\n",
      "val 损失: 0.9989 Top-1 准确率: 0.7335 Top-5 准确率: 0.9340\n",
      "\n",
      "第 89/99 轮训练\n",
      "----------\n",
      "train 损失: 0.2519 Top-1 准确率: 0.9371 Top-5 准确率: 0.9972\n",
      "val 损失: 1.0140 Top-1 准确率: 0.7299 Top-5 准确率: 0.9326\n",
      "\n",
      "第 90/99 轮训练\n",
      "----------\n",
      "train 损失: 0.2496 Top-1 准确率: 0.9395 Top-5 准确率: 0.9973\n",
      "val 损失: 1.0011 Top-1 准确率: 0.7321 Top-5 准确率: 0.9334\n",
      "\n",
      "第 91/99 轮训练\n",
      "----------\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[9], line 2\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[38;5;66;03m# 训练模型\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m model_ft \u001b[38;5;241m=\u001b[39m \u001b[43mtrain_model\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcriterion\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moptimizer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mscheduler\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnum_epochs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m100\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m      4\u001b[0m \u001b[38;5;66;03m# 保存模型\u001b[39;00m\n\u001b[1;32m      5\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mos\u001b[39;00m\n",
      "Cell \u001b[0;32mIn[7], line 50\u001b[0m, in \u001b[0;36mtrain_model\u001b[0;34m(model, criterion, optimizer, scheduler, num_epochs)\u001b[0m\n\u001b[1;32m     47\u001b[0m         optimizer\u001b[38;5;241m.\u001b[39mstep()\n\u001b[1;32m     49\u001b[0m \u001b[38;5;66;03m# 统计\u001b[39;00m\n\u001b[0;32m---> 50\u001b[0m running_loss \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[43mloss\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mitem\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;241m*\u001b[39m inputs\u001b[38;5;241m.\u001b[39msize(\u001b[38;5;241m0\u001b[39m)\n\u001b[1;32m     51\u001b[0m running_corrects \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m top1_correct\n\u001b[1;32m     52\u001b[0m running_top1_corrects \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m top1_correct\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "\n",
    "# 训练模型\n",
    "model_ft = train_model(model, criterion, optimizer, scheduler, num_epochs=100)\n",
    "\n",
    "# 保存模型\n",
    "import os\n",
    "\n",
    "# 确定要保存模型的目录\n",
    "model_dir = './models'\n",
    "os.makedirs(model_dir, exist_ok=True)  # 如果目录不存在，则创建\n",
    "\n",
    "# 保存模型到指定目录\n",
    "model_path = os.path.join(model_dir, 'res2net1.pth')\n",
    "torch.save(model_ft.state_dict(), model_path)\n",
    "print(f'Model saved as {model_path}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "213b3e4c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "9dc2168a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAHqCAYAAADrpwd3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3wUdfrA8c9s302y6Qmp9N6lHVhARSnKTxQ9RVRQsYPtsGBBRIXzsGCXs6EiZ0FB71ARVCyAgkrvgUAgpLfdZLN9fn9sshCSUEM2wPP2Na/dnZ3yzGyCk2efeb6KqqoqQgghhBBCCCGEEEIIIYSoRRPqAIQQQgghhBBCCCGEEEKIpkqS6EIIIYQQQgghhBBCCCFEPSSJLoQQQgghhBBCCCGEEELUQ5LoQgghhBBCCCGEEEIIIUQ9JIkuhBBCCCGEEEIIIYQQQtRDkuhCCCGEEEIIIYQQQgghRD0kiS6EEEIIIYQQQgghhBBC1EOS6EIIIYQQQgghhBBCCCFEPSSJLoQQQgghhBBCCCGEEELUQ5LoQohTyrhx42jRosVxrTt16lQURWnYgEJIURSmTp0afD1nzhwURWH37t1HXLdFixaMGzeuQeM5kc9GCCGEEEKcfHItfYBcSwshhDgWkkQXQjQIRVGOalq2bFmoQ200r7zyCpGRkdxxxx0oikJGRka9yz766KMoisL69esbMcJjt3//fqZOncratWtDHUrQ7t27URSF5557LtShHJW8vDwmTZpEhw4dsFgshIWF0atXL55++mlKS0tDHZ4QQgghQkCupWuTa+nGt2XLFhRFwWQyyXXpcXA6nbz44ov069ePyMhITCYT7dq1Y8KECWzfvj3U4QkhTpCiqqoa6iCEEKe+uXPn1nj9wQcfsGTJEj788MMa8y+66CISExOPez8ejwe/34/RaDzmdb1eL16vF5PJdNz7PxZDhw4lIiKCSZMm8be//Y0nn3ySKVOm1Llsq1atCA8PP6YLf0VReOKJJ4IVND6fD4/Hg9FoPGKVUIsWLRg0aBBz5sw56v0B/PHHH/Tp04f33nuvVvXNiXw2J2L37t20bNmSmTNnMmnSpEbd97FavXo1w4cPp7y8nOuuu45evXoBgfP68ccfM2DAAL777rsQRymEEEKIxibX0rXJtXTje/TRR3n33XcpKSnh1VdfZfz48SGL5VRTWFjI0KFD+fPPP7n00ksZPHgw4eHhbNu2jY8//pjc3FzcbneowxRCnABdqAMQQpwerrvuuhqvf/vtN5YsWVJr/qEcDgcWi+Wo96PX648rPgCdTodO1zj/7DkcDn766SfeeOMN+vXrR5s2bfjPf/5T54X/ypUryczM5J///OcJ7VOr1aLVak9oGyfiRD6bM0FpaSmXX345Wq2WNWvW0KFDhxrvP/PMM7z11lsNsq+KigrCwsIaZFtCCCGEOPnkWromuZZufKqqMm/ePK699loyMzP56KOPmmwSvSle644bN441a9Ywf/58Ro0aVeO9p556ikcffbRB9uP1evH7/RgMhgbZnhDi6Ek7FyFEoxk0aBBdunThzz//5LzzzsNisfDII48A8OWXX3LJJZeQnJyM0WikdevWPPXUU/h8vhrbOLRX4MGtPP7973/TunVrjEYjffr0YfXq1TXWrauPo6IoTJgwgYULF9KlSxeMRiOdO3fm22+/rRX/smXL6N27NyaTidatWzN79ux6e0N+//33uFwuhg0bBsCYMWPYunUrf/31V61l582bh6IojB49GrfbzZQpU+jVqxeRkZGEhYVx7rnn8uOPPx7x/NbVx1FVVZ5++mlSU1OxWCycf/75bNq0qda6xcXFTJo0ia5duxIeHo7VamXYsGGsW7euxvH36dMHgBtvvDF4W3F1BU5dfRwrKir4xz/+QVpaGkajkfbt2/Pcc89x6E1Qx/I5HK/8/HxuvvlmEhMTMZlMdO/enffff7/Wch9//DG9evUiIiICq9VK165deemll4LvezwennzySdq2bYvJZCI2NpZzzjmHJUuWHHb/s2fPJjs7mxdeeKFWAh0gMTGRxx57LPj60D6d1Q7twVn9uf/000/ceeedJCQkkJqayvz584Pz64pFURQ2btwYnLd161auvPJKYmJiMJlM9O7dm6+++uqwxySEEEKIxiPX0nItfTKvpZcvX87u3bu55ppruOaaa/j555/Zt29freX8fj8vvfQSXbt2xWQyER8fz9ChQ/njjz9qLDd37lz69u2LxWIhOjqa8847r8Ydlyd6rQuwZ88e7rzzTtq3b4/ZbCY2Nparrrqqzr72paWl3HfffbRo0QKj0Uhqaio33HADhYWFlJeXExYWxj333FNrvX379qHVapkxY0a95+73339n0aJF3HzzzbUS6ABGo7FG68lBgwYxaNCgWssd7vdz1qxZwd/PNWvWoNPpePLJJ2ttY9u2bSiKwquvvlrj2O+9997gz1GbNm149tln8fv99R6TEKI2qUQXQjSqoqIihg0bxjXXXMN1110XvB11zpw5hIeHc//99xMeHs4PP/zAlClTsNlszJw584jbnTdvHna7ndtuuw1FUfjXv/7FFVdcwa5du45Y1fHrr7/yxRdfcOeddxIREcHLL7/MqFGjyMrKIjY2FoA1a9YwdOhQkpKSePLJJ/H5fEybNo34+Pg6t/n111/Tq1ev4PGNGTOGJ598knnz5nHWWWcFl/P5fHz66aece+65pKenU1hYyNtvv83o0aO55ZZbsNvtvPPOOwwZMoRVq1bRo0ePoznNQVOmTOHpp59m+PDhDB8+nL/++ouLL7641q2Eu3btYuHChVx11VW0bNmSvLw8Zs+ezcCBA9m8eTPJycl07NiRadOmMWXKFG699VbOPfdcAAYMGFDnvlVV5f/+7//48ccfufnmm+nRoweLFy/mgQceIDs7mxdffPGYP4fjVVlZyaBBg8jIyGDChAm0bNmSzz77jHHjxlFaWhq8YF6yZAmjR4/mwgsv5NlnnwUCvSGXL18eXGbq1KnMmDGD8ePH07dvX2w2G3/88Qd//fUXF110Ub0xfPXVV5jNZq688soTOpb63HnnncTHxzNlyhQqKiq45JJLCA8P59NPP2XgwIE1lv3kk0/o3LkzXbp0AWDTpk2cffbZpKSk8PDDDxMWFsann37KyJEj+fzzz7n88stPSsxCCCGEODZyLS3X0ifrWvqjjz6idevW9OnThy5dumCxWPjPf/7DAw88UGO5m2++mTlz5jBs2DDGjx+P1+vll19+4bfffqN3794APPnkk0ydOpUBAwYwbdo0DAYDv//+Oz/88AMXX3zxUZ//gx16rQuBVokrVqzgmmuuITU1ld27d/PGG28waNAgNm/eHLxLo7y8nHPPPZctW7Zw0003cdZZZ1FYWMhXX33Fvn376NGjB5dffjmffPIJL7zwQo07Ev7zn/+gqipjxoypN7bqwpPrr7/+uI7tSN577z2cTie33norRqORpKQkBg4cyKeffsoTTzxRY9lPPvkErVbLVVddBQTu6hg4cCDZ2dncdtttpKens2LFCiZPnkxOTg6zZs06KTELcVpShRDiJLjrrrvUQ/+JGThw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RtKpUydWrlzJ0qVLiY2NrbHcAw88wPz587nqqqu46aab6NWrF8XFxXz11Ve8+eabdO/ePbjstddey4MPPsiCBQu444470Ov1RxXLBx98wMUXX8wVV1zBiBEjuPDCCwkLC2PHjh18/PHH5OTkBK/Db7rpJl544QWGDBnCzTffTH5+Pm+++SadO3cODlJ6tK6++mquu+46Xn/9dYYMGUJUVFStY//qq6+49NJLGTduHL169aKiooINGzYwf/58du/efcx/XwhxxlKFEOIkuOuuu9RD/4kZOHCg2rlz5zqXX758ufq3v/1NNZvNanJysvrggw+qixcvVgH1xx9/DC43duxYtXnz5sHXmZmZKqDOnDmz1jYB9Yknngi+fuKJJ2rFBKh33XVXrXWbN2+ujh07tsa877//Xu3Zs6dqMBjU1q1bq2+//bb6j3/8QzWZTKqqqqrf71cTEhLUf/3rX3UeY7VFixapgJqUlKT6fL4a7/n9fnX69Olq8+bNVaPRqPbs2VP93//+V+u46zq+9957TwXUzMzM4Dyfz6c++eSTalJSkmo2m9VBgwapGzdurHV8TqdT/cc//hFc7uyzz1ZXrlypDhw4UB04cGCN/X755Zdqp06dVJ1OpwLqe++9p6pq7c9GVVXVbrer9913n5qcnKzq9Xq1bdu26syZM1W/31/rWI72czhU9c9AfdOHH36oqqqq5uXlqTfeeKMaFxenGgwGtWvXrsHYq82fP1+9+OKL1YSEBNVgMKjp6enqbbfdpubk5ASXefrpp9W+ffuqUVFRqtlsVjt06KA+88wzqtvtPmyc1fbv36/ed999art27VSTyaRaLBa1V69e6jPPPKOWlZUFl/P5fOpDDz2kxsXFqRaLRR0yZIiakZFR65xUf+6rV6+ud59LlixRAVVRFHXv3r11LrNz5071hhtuUJs1a6bq9Xo1JSVFvfTSS9X58+cf1XEJIYQQouHItXT95Fq64a6ln3/+eRVQv//++3qXmTNnjgqoX375paqqqur1etWZM2eqHTp0UA0GgxofH68OGzZM/fPPP2us9+6776o9e/ZUjUajGh0drQ4cOFBdsmRJ8P2GuNYtKSkJXt+Hh4erQ4YMUbdu3VrncRcVFakTJkxQU1JSVIPBoKampqpjx45VCwsLa213+PDhKqCuWLGi3vNSF4fDoT733HNqnz591PDwcNVgMKht27ZVJ06cqGZkZNRYdu7cuWqrVq1Ug8Gg9ujRQ128ePEx/X5Ws9lsqtlsVgF17ty5dS5jt9vVyZMnq23atFENBoMaFxenDhgwQH3uueeO+m8YIYSqKqrahL6eFkKIU8zIkSPZtGkTO3bsYNWqVfTr149NmzY1+Gj0QgghhBBCnG7kWlo0RZdffjkbNmyos4+/EOLMJT3RhRDiKFVWVtZ4vWPHDr7++msGDRoUnDd9+nS56BdCCCGEEOIQci0tTgU5OTksWrSI66+/PtShCCGaGKlEF0KIo5SUlMS4ceNo1aoVe/bs4Y033sDlcrFmzRratm0b6vCEEEIIIYRosuRaWjRlmZmZLF++nLfffpvVq1ezc+dOmjVrFuqwhBBNiAwsKoQQR2no0KH85z//ITc3F6PRSP/+/Zk+fbpc9AshhBBCCHEEci0tmrKffvqJG2+8kfT0dN5//31JoAshapFKdCGEEEIIIYQQQgghhBCiHtITXQghhBBCCCGEEEIIIYSohyTRhRBCCCGEEEIIIYQQQoh6nHE90f1+P/v37yciIgJFUUIdjhBCCCGEOMOoqordbic5ORmN5syuaZFrcyGEEEIIEUpHe21+xiXR9+/fT1paWqjDEEIIIYQQZ7i9e/eSmpoa6jBCSq7NhRBCCCFEU3Cka/MzLokeEREBBE6M1WoNcTRCCCGEEOJMY7PZSEtLC16Xnsnk2lwIIYQQQoTS0V6bn3FJ9OrbRK1Wq1yoCyGEEEKIkJH2JXJtLoQQQgghmoYjXZuf2U0YhRBCCCGEEEIIIYQQQojDkCS6EEIIIYQQQgghhBBCCFEPSaILIYQQQgghhBBCCCGEEPU443qiCyGEEEIczOfz4fF4Qh2GOM3o9Xq0Wm2owxBCCCGEEEI0AEmiCyGEEOKMpKoqubm5lJaWhjoUcZqKioqiWbNmMoCoEEIIIYQQpzhJogshhBDijFSdQE9ISMBisUiiUzQYVVVxOBzk5+cDkJSUFOKIhBBCCCGEECdCkuhCCCGEOOP4fL5gAj02NjbU4YjTkNlsBiA/P5+EhARp7SKEEEIIIcQpTAYWFUIIIcQZp7oHusViCXEk4nRW/fMlPfeFEEIIIYQ4tUkSXQghhBBnLGnhIk4m+fkSQgghhBDi9CBJdCGEEEIIIYQQQgghhBCiHpJEF0IIIYQ4g7Vo0YJZs2Yd9fLLli1DURRKS0tPWkwiNH7++WdGjBhBcnIyiqKwcOHCI66zbNkyzjrrLIxGI23atGHOnDknPU4hhBBCCCEamyTRhRBCCCFOAYqiHHaaOnXqcW139erV3HrrrUe9/IABA8jJySEyMvK49ne0JFnf+CoqKujevTuvvfbaUS2fmZnJJZdcwvnnn8/atWu59957GT9+PIsXLz7JkQohhBBCCNG4dKEOQAghhBBCHFlOTk7w+SeffMKUKVPYtm1bcF54eHjwuaqq+Hw+dLojX+rFx8cfUxwGg4FmzZod0zri1DBs2DCGDRt21Mu/+eabtGzZkueffx6Ajh078uuvv/Liiy8yZMiQkxWmEEIIIYQQjU4q0YUQQgghTgHNmjULTpGRkSiKEny9detWIiIi+Oabb+jVqxdGo5Fff/2VnTt3ctlll5GYmEh4eDh9+vRh6dKlNbZ7aDsXRVF4++23ufzyy7FYLLRt25avvvoq+P6hFeJz5swhKiqKxYsX07FjR8LDwxk6dGiNpL/X6+Xuu+8mKiqK2NhYHnroIcaOHcvIkSOP+3yUlJRwww03EB0djcViYdiwYezYsSP4/p49exgxYgTR0dGEhYXRuXNnvv766+C6Y8aMIT4+HrPZTNu2bXnvvfeOO5Yz1cqVKxk8eHCNeUOGDGHlypUhikgIIYQQQoiTQyrRG4nL62PFziKKyt1c2Ss11OEIIYQQ4hCqqlLp8TX6fs16LYqiNMi2Hn74YZ577jlatWpFdHQ0e/fuZfjw4TzzzDMYjUY++OADRowYwbZt20hPT693O08++ST/+te/mDlzJq+88gpjxoxhz549xMTE1Lm8w+Hgueee48MPP0Sj0XDdddcxadIkPvroIwCeffZZPvroI9577z06duzISy+9xMKFCzn//POP+1jHjRvHjh07+Oqrr7BarTz00EMMHz6czZs3o9frueuuu3C73fz888+EhYWxefPmYLX+448/zubNm/nmm2+Ii4sjIyODysrK447lTJWbm0tiYmKNeYmJidhsNiorKzGbzbXWcblcuFyu4GubzXbS4xRCCCGEECfO5/dR4a3A4XHg8Dhw+914/d7g5FN9wUcAharWk4c8+lV/jcmn+gJ30qo+eib0JMGSEOIjrZsk0RuJy+vnxvdWA3BJ1yTMBm2IIxJCCCHEwSo9PjpNafxezpunDcFiaJhLsmnTpnHRRRcFX8fExNC9e/fg66eeeooFCxbw1VdfMWHChHq3M27cOEaPHg3A9OnTefnll1m1ahVDhw6tc3mPx8Obb75J69atAZgwYQLTpk0Lvv/KK68wefJkLr/8cgBeffXVYFX48ahOni9fvpwBAwYA8NFHH5GWlsbChQu56qqryMrKYtSoUXTt2hWAVq1aBdfPysqiZ8+e9O7dGwhU44vGMWPGDJ588slQhyGEEEKIU5yqqoEkLH5QQSXwWkVFVdXga7/qDyZoq+d5/V48fg8enweP34Pb7w4+Bw4kfKuSvtVqrONz4/a7cfvcePyeGknk4KR68fg8OH1OXF4XTp8Tp9eJy+fC6XXiU30oKGgUDSgE96lRNGgUDVpFi1ajRaNo0Cm6wDyNFp/fh1f11tqX1+/F7XMHH91+dzBWn9+HRtGgKIHtVx9b9X6C+6vaZ/Vzt99NhSeQOHf6nCf9c33lglckiX6mizDqMOk1OD1+8u1OmseGhTokIYQQQpxmqpPC1crLy5k6dSqLFi0iJycHr9dLZWUlWVlZh91Ot27dgs/DwsKwWq3k5+fXu7zFYgkm0AGSkpKCy5eVlZGXl0ffvn2D72u1Wnr16oXf7z+m46u2ZcsWdDod/fr1C86LjY2lffv2bNmyBYC7776bO+64g++++47BgwczatSo4HHdcccdjBo1ir/++ouLL76YkSNHBpPx4ug1a9aMvLy8GvPy8vKwWq11VqEDTJ48mfvvvz/42mazkZaWdlLjFEIIIURAdXK5uvLX6/dS6a0MTk6vM/jc7XcHlwsmo1Hx+X14/B5cPteBqSpB7PK58KuB6zuFQPK5OiENByW6D0pyq6j4/f4acTi8juDz6m0eWrEsQken0RGmD8OgMaDT6NAqWnQaXXDSKoHC4YO/0FBVFT+Bz746aV+duFcUJfhoNVhDfHT1kyR6I1EUhUSriT1FDvJsLkmiCyGEEE2MWa9l87TGHwzRrG+4u9PCwmpeX0yaNIklS5bw3HPP0aZNG8xmM1deeSVut/uw29Hr9TVeK4py2IR3XcurqnqM0Tes8ePHM2TIEBYtWsR3333HjBkzeP7555k4cSLDhg1jz549fP311yxZsoQLL7yQu+66i+eeey6kMZ9q+vfvX+uOgiVLltC/f/961zEajRiNxpMdmhBCCNFoDk4y+1Rf8NHn9wUTy9XJ6ernbr+7zsRwdcKxOulcXTlc/drj9wSSzB5HzYSzJ/Do8DqC7x38/OAk+JmsugJbr9EHJq0enUYXfK3T1EyTBhPAVedNr9Fj0BjQa2s/ViePq7dTnVjWa/SYdCZMWhNGnRGT1oRJZ8KoNaJVtDUTzYGSevxU/Wz4fYGfpaqfK6/fi1/1o1E0tfZTPek1egxaQ+34FF2NLzGqE9p+Avs5+Oe2ep8+vw+9Vo9FZyFMHxacDFpDKD6+kJMkeiNKiDCyp8hBvv3k3/4ghBBCiGOjKEqDtVVpKpYvX864ceOCbVTKy8vZvXt3o8YQGRlJYmIiq1ev5rzzzgPA5/Px119/0aNHj+PaZseOHfF6vfz+++/BCvKioiK2bdtGp06dgsulpaVx++23c/vttzN58mTeeustJk6cCEB8fDxjx45l7NixnHvuuTzwwANnfBK9vLycjIyM4OvMzEzWrl1LTEwM6enpTJ48mezsbD744AMAbr/9dl599VUefPBBbrrpJn744Qc+/fRTFi1aFKpDEEIIcYbyq35sLhvFrmIq3BU1Wl0c3GLD5XMFk8sOjyPQpqIq+ez3++tsdaGgUOmtpNxTToWnIvDorsDusePwOE6LqmiT1oRZZ64xGbSGYLVw9aQoCho06DS6YFLYqDXWSBBrFE2NZH11YYWKGmhbwoFk9sGPJl3NGCx6C2adObjNQyuWtYr2QK/tqrgO/sJBq9EG5x38mQpxvE6vvxSbuIQIEwD5NtcRlhRCCCGEOHFt27bliy++YMSIESiKwuOPP37cLVROxMSJE5kxYwZt2rShQ4cOvPLKK5SUlBzVHzIbNmwgIiIi+FpRFLp3785ll13GLbfcwuzZs4mIiODhhx8mJSWFyy67DIB7772XYcOG0a5dO0pKSvjxxx/p2LEjAFOmTKFXr1507twZl8vF//73v+B7Z7I//vijxmCv1W1Xxo4dy5w5c8jJyanRCqhly5YsWrSI++67j5deeonU1FTefvtthgxp/Ds6hBBCnB68fi92tx2b20aZqyz43OayBR6rJ5eNElcJJc4SSl2llLpKg21EmhKdRodZa65RgWzSmtBr9fUmhoFalcnV1crVVcEHJ5mrpzB9GBadJTjforNg1psxa83oNLpgMrk6sVzdUsOkMwWT20KI+kkSvRHFRwRuXc23SxJdCCGEECffCy+8wE033cSAAQOIi4vjoYcewmazNXocDz30ELm5udxwww1otVpuvfVWhgwZglZ75FY21dXr1bRaLV6vl/fee4977rmHSy+9FLfbzXnnncfXX38dbC3j8/m466672LdvH1arlaFDh/Liiy8CYDAYmDx5Mrt378ZsNnPuuefy8ccfN/yBn2IGDRp02DY8c+bMqXOdNWvWnMSohBBCnA48Pg+5jlxyynPYX7E/+JhbkUupqxSby0aZu4wKT8UJ7SdCH0G4IRy9Ro9WU9XmQjnQ6sKgMWDRBxLNYbqwwPOqxLNW0dYYmLK6pYaqqsEkdbghnHB9YAozhBGmCwu21NBoNLV6PR/aHkQIcepS1FA3rGxkNpuNyMhIysrKsFobt1n968sy+Ne327jirBRe+HuPRt23EEIIIQ5wOp1kZmbSsmVLTCZTqMM54/j9fjp27Mjf//53nnrqqVCHc9LU93MWyuvRpkbOhRBCnJ5UVWV7yXa+3f0tS/csZY9tzzH14w7Th2E1WAOT0Rp8HmGICM6LNkUTbYwOPkYZo9Br9UfeuBBCHORor0flK7FGlCjtXIQQQghxBtqzZw/fffcdAwcOxOVy8eqrr5KZmcm1114b6tCEEEII0YAySjL4dve3LN69mN223TXeM2qNJIUlkRSWRHJ4cuB5eBIxphisBiuRxshgolwquIUQTY38q9SIEqzV7VxkYFEhhBBCnDk0Gg1z5sxh0qRJqKpKly5dWLp0qfQhF0IIIU4TC3Ys4P1N77OzbGdwnkFj4NzUcxnaYii9m/Um1hQrAzsKIU5ZkkRvRMGBRaUnuhBCCCHOIGlpaSxfvjzUYQghhBDiJFievZwpK6YAoNfoOTvlbIa0GML5aecTpg8LcXRCCNEwJIneiBKqBhYtdXhweX0YdUceTEsIIYQQQgghhBCiKbK5bcEE+sg2I3mgzwNYDTLGhRDi9KMJdQBnkiiLHoM2cMoLpBpdCCGEEEIIIYQQp7BnVz1LviOf5tbmPNLvEUmgCyFOW5JEb0SKohAfUd0XXZLoQgghhBBCCCGEODX9kPUDX+38Co2i4emzn8asM4c6JCGEOGkkid7IgoOL2mRwUSGEEEIIIYQQQpx6SpwlPLnySQDGdh5Lj4QeoQ1ICCFOMkmiN7IEqUQXQgghhBBCCCHEKUpVVZ767SmKncW0iWrDXT3uCnVIQghx0kkSvZElRJgAyLdJEl0IIYQQQgghhBCnlm93f8uSPUvQKTqePudpjFpjqEMSQoiTTpLojexAJbq0cxFCCCFE4xs0aBD33ntv8HWLFi2YNWvWYddRFIWFCxee8L4bajtCCCGECI0CRwFP//Y0ALd2u5XOsZ1DHJEQQjQOSaI3smBPdGnnIoQQQohjMGLECIYOHVrne7/88guKorB+/fpj3u7q1au59dZbTzS8GqZOnUqPHj1qzc/JyWHYsGENuq9DzZkzh6ioqJO6DyGEEOJMpKoqU1dOxea20TGmI+O7jQ91SEII0Wh0oQ7gTJNgDbRzyZN2LkIIIYQ4BjfffDOjRo1i3759pKam1njvvffeo3fv3nTr1u2YtxsfH99QIR5Rs2bNGm1fQgghxJnO6/fiU311vudX/Tg8DhweB+Wecio8FTi8Dsrd5VR6K3H73Xh8nsCj34PH5yHPkcfP+35Gr9Ez/Zzp6DX6Rj4iIYQIHUmiN7Lqdi4F0s5FCCGEEMfg0ksvJT4+njlz5vDYY48F55eXl/PZZ58xc+ZMioqKmDBhAj///DMlJSW0bt2aRx55hNGjR9e73RYtWnDvvfcGW7zs2LGDm2++mVWrVtGqVSteeumlWus89NBDLFiwgH379tGsWTPGjBnDlClT0Ov1zJkzhyeffBIItG+BQJJ/3LhxKIrCggULGDlyJAAbNmzgnnvuYeXKlVgsFkaNGsULL7xAeHg4AOPGjaO0tJRzzjmH559/HrfbzTXXXMOsWbPQ64/vD/esrCwmTpzI999/j0ajYejQobzyyiskJiYCsG7dOu69917++OMPFEWhbdu2zJ49m969e7Nnzx4mTJjAr7/+itvtpkWLFsycOZPhw4cfVyxCCCHE8fCrfiq9lZS7y6nwVlDgKCC7PJvs8mz2l+9nf/l+9pXvo8BRgIra4Puf0HMCbaLbNPh2hRCiKQtpEv2NN97gjTfeYPfu3QB07tyZKVOm1Hub75w5c7jxxhtrzDMajTidp05Cunpg0aIKN16fH51WOuoIIYQQTYKqgsfR+PvVW6Aq2Xw4Op2OG264gTlz5vDoo48GE9SfffYZPp+P0aNHU15eTq9evXjooYewWq0sWrSI66+/ntatW9O3b98j7sPv93PFFVeQmJjI77//TllZWY3+6dUiIiKYM2cOycnJbNiwgVtuuYWIiAgefPBBrr76ajZu3Mi3337L0qVLAYiMjKy1jYqKCoYMGUL//v1ZvXo1+fn5jB8/ngkTJjBnzpzgcj/++CNJSUn8+OOPZGRkcPXVV9OjRw9uueWWIx5PXcd32WWXER4ezk8//YTX6+Wuu+7i6quvZtmyZQCMGTOGnj178sYbb6DValm7dm0wYX/XXXfhdrv5+eefCQsLY/PmzcGEvxBCCHEkqqri9DkpdhZTVFlEYWUhRc4iiioDU5m77ED190GPHr+HSm8lFZ6KYMV4Q7HoLITpw2pMFp0FvVaPQWtAr9Fj0BgCrzUGmoU14+r2VzfY/oUQ4lQR0iR6amoq//znP2nbti2qqvL+++9z2WWXsWbNGjp3rntwCqvVyrZt24KvlaP4o7MpiQ0zoNUo+PwqheVumkWaQh2SEEIIISCQQJ+e3Pj7fWQ/GMKOatGbbrqJmTNn8tNPPzFo0CAgUOU9atQoIiMjiYyMZNKkScHlJ06cyOLFi/n000+PKom+dOlStm7dyuLFi0lODpyL6dOn1ypwOLgSvkWLFkyaNImPP/6YBx98ELPZTHh4ODqd7rDtW+bNm4fT6eSDDz4gLCxw/K+++iojRozg2WefDVaGR0dH8+qrr6LVaunQoQOXXHIJ33///XEl0b///ns2bNhAZmYmaWlpAHzwwQd07tyZ1atX06dPH7KysnjggQfo0KEDAG3btg2un5WVxahRo+jatSsArVq1OuYYhBBCnJo8fg855Tlk2bPYa99Ltj2bck85Hr8Hl8+Fy+fC4ws8d/vcOH1OXD4XTq8z+L7L58Kv+hssJq2ixaK3EGeOIzk8mZSwFFIiUoLPk8KTMOvMda6roGDSmdAoUtgnhBBHI6RJ9BEjRtR4/cwzz/DGG2/w22+/1ZtEVxTllO6nqdEoxIUbyLO5yLc7JYkuhBBCiKPWoUMHBgwYwLvvvsugQYPIyMjgl19+Ydq0aQD4fD6mT5/Op59+SnZ2Nm63G5fLhcViOartb9myhbS0tGACHaB///61lvvkk094+eWX2blzJ+Xl5Xi9XqxW6zEdy5YtW+jevXswgQ5w9tln4/f72bZtWzCJ3rlzZ7RabXCZpKQkNmzYcEz7OnifaWlpwQQ6QKdOnYiKimLLli306dOH+++/n/Hjx/Phhx8yePBgrrrqKlq3bg3A3XffzR133MF3333H4MGDGTVq1HH1oRdCCBFaPr8Pp89JpbcSl89Fubscm9tGqauUMldZYHIHHnPKc9hr30tORU69/cWPlV6jJ84cR6wpllhz1WSKJdIYiVFrPFABftCjUWskXB9eo2LcqDWecoWFQghxqmoyPdF9Ph+fffYZFRUVdf6xVq28vJzmzZvj9/s566yzmD59er0JdwCXy4XLdWAQT5vN1qBxHzW3A7Z/A/Y8Eq3dyLO5ZHBRIYQQoinRWwJV4aHY7zG4+eabmThxIq+99hrvvfcerVu3ZuDAgQDMnDmTl156iVmzZtG1a1fCwsK49957cbvdDRbuypUrGTNmDE8++SRDhgwhMjKSjz/+mOeff77B9nGwQ3ufK4qC399wVXyHmjp1Ktdeey2LFi3im2++4YknnuDjjz/m8ssvZ/z48QwZMoRFixbx3XffMWPGDJ5//nkmTpx40uIRQghRk8/vQ0VFo2hqVVH7/D7yHfnste9lr30v+8r3BZ8XOgqp9FXi9Drx+D3HtW+T1kRqRCqpEamkRaQRaYjEoDUEk9zVzw0aAyatCaPOGHjUGoPPTToT4fpwSX4LIcQpJuRJ9A0bNtC/f3+cTifh4eEsWLCATp061bls+/bteffdd+nWrRtlZWU899xzDBgwgE2bNpGamlrnOjNmzAgObhVSfi/MvwmAtOb/ZT2QL4OLCiGEEE2Hohx1W5VQ+vvf/84999zDvHnz+OCDD7jjjjuCf4gvX76cyy67jOuuuw4I9ADfvn17vddWh+rYsSN79+4lJyeHpKQkAH777bcay6xYsYLmzZvz6KOPBuft2bOnxjIGgwGf7/DVeh07dmTOnDlUVFQEq9GXL1+ORqOhffv2RxXvsao+vr179war0Tdv3kxpaWmNc9SuXTvatWvHfffdx+jRo3nvvfe4/PLLAUhLS+P222/n9ttvZ/Lkybz11luSRBdCiJOoqLKINflr+DPvT/7M+5NtJdtqtESpTqZr0OBX/XhV7zFt36wzY9aZiTJGEWmMDEyGyODzeHM86dZ00iLSiDfHS/JbCCEagN3pYXehg12F5ewqqGBXYQWZheX8a1R3OiUf2x2ujSXkSfT27duzdu1aysrKmD9/PmPHjuWnn36q84+9/v3716hSHzBgAB07dmT27Nk89dRTdW5/8uTJ3H///cHXNputxi28jcZkBXM0VJbQ1lAM6MmXSnQhhBBCHKPw8HCuvvpqJk+ejM1mY9y4ccH32rZty/z581mxYgXR0dG88MIL5OXlHXUSffDgwbRr146xY8cyc+ZMbDZbjWR59T6ysrL4+OOP6dOnD4sWLWLBggU1lmnRogWZmZmsXbuW1NRUIiIiMBqNNZYZM2YMTzzxBGPHjmXq1KkUFBQwceJErr/++mArl+Pl8/lYu3ZtjXlGo5HBgwfTtWtXxowZw6xZs/B6vdx5550MHDiQ3r17U1lZyQMPPMCVV15Jy5Yt2bdvH6tXr2bUqFEA3HvvvQwbNox27dpRUlLCjz/+SMeOHU8oViGEOJPklOewtmAta/LXsK5gHU6vM5i0thqtwedh+jAySjP4M+9Pdtt2H3abftVfI6mu0+hICU8JVIyHByrG0yLSaBbWDIvOgklnwqwzB6rDpR3KSaGqKr6iIlwZGbh2ZODamYG/woGiUUDRBAoXNAooCoqioLo9+J1OVKcTv9OJ31mJ6nShulyg1aLodChaLeh1KDp98LWq+kEF/H5Q1cBrv4qi16OLjw9MCQlVj4HXGqMRv8OBv6ICf0UFvooKVIcDv8MBOh3ayEi0kVFoI61VzyNRzGbUykq8RUV4CwrxFhbgLSzEV1iIr7QUxWxGG2FFY41AG2FFa41AExGBotPhycvDu38/nv05eHJy8OzfjycnB39lJbroaLSxsehiY9HGxqCLiUUXF4smLAxQQKMBBRRN1TlTNGitEcFj0kZHB947hN/lCuwnez+e7Gy8BQVozOZD4gs8Kno93qLiA8cUPMZCUFWMbVpjbNcOY9u2GJo3R9HVnUb0lVfgzcvFm5eHNioKQ5s2aAyGE/458mTvx5ubgyYiAq3VGvw85Pe26bE7PezIL2dHnp1dhRU4XD48Pj9unx+314/H58fjUyl3etldVEG+ve6c6I58uyTR62MwGGjTpg0AvXr1YvXq1bz00kvMnj37iOvq9Xp69uxJRkZGvcsYjcZaf7SFTFQ6VJbQUlcIJNX7AyOEEEIIcTg333wz77zzDsOHD6/Rv/yxxx5j165dDBkyBIvFwq233srIkSMpKys7qu1qNBoWLFjAzTffTN++fWnRogUvv/wyQ4cODS7zf//3f9x3331MmDABl8vFJZdcwuOPP87UqVODy4waNYovvviC888/n9LSUt57770ayX4Ai8XC4sWLueeee+jTpw8Wi4VRo0bxwgsvnNC5gUD7v549e9aY17p1azIyMvjyyy+ZOHEi5513HhqNhqFDh/LKK68AoNVqKSoq4oYbbiAvL4+4uDiuuOKK4F2NPp+Pu+66i3379mG1Whk6dCgvvvjiCccrhBCnIrfPzT77PrLsWRRWFqJVtGgUDVqNFq1SNWm05FbksjY/kDjPc+Qd177aRLWhV2IveiX2okd8Dyx6SyBRqwZau1S3eFFQiDPHodVoj7xR0aDKly/HvnQp7h0ZuDIy8JWWhjqkhqPVwhHusDseHocDT3b28W9Ap0MXFxdIqsfE4CstDSbNG4r9uwPPFb0eQ+vWGNu1RWM04cnLxZuTiyc3F7/dXis2Y6tWmDp2wNihY+CxfXu04eFVX6Jogl+iAPjdbtwZGTi3bMW5bSuuLVtxbt1ae7tVcWiqvuCoTqxrI62BedaqeVGRAPhsdvx2Gz6bHZ/dht9ejt9uw+9yo3o94PGieg9M+P1oY2LQJyaiS2qGPrEZ+qRm6JoloW+WiDY2Fs0RcozekhLcGYHfA1fGTvzl5WjjYtHFxaOLiw18ZnFxaOPi0EZFHfMXAqrHg6+srGqy4SsrxW+zBV7b7aguN6rHc2ByB14rOl3gS5H27TG2a48uoeadNR6fnwK7izybkzybk4KCMmxZ2Sh2G0afG6PXjdHtxOB1o/e40Hlc2BxuCiq9FFR4KHX68Csa/IoGr0aD3WCh1BhBqTGcUmM45Xoz6iEtuOLCjbSJNtLOqqVVuEJzs0KnZnUPhtwUKKqqqqEO4mAXXHAB6enpzJkz54jL+nw+OnfuzPDhw4/6Dy6bzUZkZCRlZWXHPADWCfvketjyFX90fIgr13RncMcE3h7bp3FjEEIIIQROp5PMzExatmyJySSDfIuTo76fs5BejzYxci6EaNpcPhfZ9myy7Fnsse1hr30ve2x7yLJlkVORg8qxpRO0ipb2Me3pmdCTHgk9iDZGY3PbagzmaXPZsLltpIanclbiWfRM6EmkMfIkHaFoCJ68PDIGXwSeg3rNKwr69DSMbdpibN0abVQUqCqoflRVBX/gOaqKYjCgmExoTKbAo9mMYjSiMRpRfX7wHZTo9HgDyU+/n0C1dlUiVqOpqnIH1eXGW1CANz+/1qPf40FrsaAJCwtMwecWVHdVcrI6IWmz1TgmxWQKVLVXJUF18YEkqL/SGUjQVidqbfaqZKYLXbNE9EnJ6JOS0Ccno09OQp+UhCYsDG9xMb7iYrxFRYEK8KJivEWFqI7KwO+WXw2cM78/WGXvKyvDm5+Pr7j4sJ+JYrFgSElBn5KCLiEB1eU8kEiuis9vs+F3u9HFxBxI7MZXHVtcPPi8OHfswLVjB64dGagOx2H3qYmIQJeYgK+gEN9RFnAEVtRU/WzU8e+JXo8+KSlw18Ahn0eoaMLDq+4eiEUXG4M2NhZFo8W1a1fgC6TCwqPelmIyoU9JwZCaij41FX1aauB5Sgr+igrc+/bh2ZeNZ+9e3Nn78Ozdhzc/v+5zdYwc5ghy41LIikqmUDFhsRUTV1lKfGUZcZWlRHgqT3gfB1O1WrwRkfjDIzB4PWidlaiOCtRDxm5K+/dsws87r0H3fSRHez0a0kr0yZMnM2zYMNLT07Hb7cybN49ly5axePFiAG644QZSUlKYMWMGANOmTeNvf/sbbdq0obS0lJkzZ7Jnzx7Gjx8fysM4etHNAYj3Br59l0p0IYQQQgghhBCh5Ff95FbkklGaQWZZZiBJbs9ir23vERPlFp2F5tbmJFgSAhXhqg+f34df9QefRxgi6B7fnZ4JPekS1wXLMQ6oLZq+krlzwePB2KEDsTfdiLFNGwytWqE5xQsVVFVFrazEZ7ejCQtHE2Zp0DYihubNjz82t7uqvUzVlwRFxWijotCnpKBPST6uCufD7s/vx5OdHUiob9+O6vEeqNBOaoYusRna8MAYN6qq4s3NDVSVb90SrCr37N1b98arBozXRkZi7NgRU/v2GDt2wNSxI8aWLVGq2sKoqorqcBz4kqO0qhrbVlZViW078Loqia+xRqKNCA+2r9FERKCNiEAxmlD0ukB7Gq020CZIrwNFwVdUhCcnF29eLp6c3AMV9/n54PHgLy/HXV4Oh4wJdDBdchLGNm0wtmmLNjoKX2ER3sLCwGdWWBD8okF1OnHv3Il7585j+0AUBU1EBGp4BJ6wCJwmCxWGMGw6I2VeDaUelRIPOFUFj0aHR6PD5HPTwpZDy7IcUsoLsFTaabV3K632bq13Nx6jGXeYFa/BiMdgxKM34tYbceuMuHV6TAY9kSYNkQYtVoMWPX5Uvx/V68FXWoqvKPAlkd9mQ/H50JcWQ2ngCyD/IftSDAY0FgvqSbjro6GENImen5/PDTfcQE5ODpGRkXTr1o3Fixdz0UUXAZCVlYXmoP5OJSUl3HLLLeTm5hIdHU2vXr1YsWLFUff5DLmowD+QUe79AOTZZGBRIYQQQgghhBAnh6qqOH1Oylxl2Nw2bK5A1fce+x52lu5kZ+lOdpXtotJbf8VhdaI8LSKN5tbmpFvTSY9IJ92aTqwpVnoTn+H8FRWUfPIpAPF3TyTiggtCHFHDURQFxWJBY2l6X/woBkOgur1qIPiTvj+NBkNaGoa0tCN+xoqiBGOLuOD84Hy/0xmoOvZX3Y1QVWWPqoJGgzYm5rD/niiKglJ1B0FjHffBVFXFb7PhLSrGV1QYvHPAV1SM6nZhaNky8AVS6zbBLxQOx+9249m/n4o9e3HsycKZtRdvdja+/dmQm4PPaKYyLhFbVALF1jjywmLYZ4omUxfJTpeWYufRJZsTIoykRptJijSTZdFTZtazR+snoTiH6Nw9RGTvxuRxEpaaRERqCobkJPTNmqFLSgq032kAqtuNt+quC7/djsZkqnkniMUS/LKkKQtpEv2dd9457PvLli2r8frFF188tftOViXRLY5Az6vCcjc+v4pWIxcdQgghhBBCCCGOj9fvZVfZLjYVbmJj4UY2FW0ityIXm9uGx3/k9gc6jY4W1ha0jGxJC2uLYLI8LSJNEuXisEo//wK/zYahRQvCBw0KdTiiCdOYTHAK352gKEpwsFlatTzq9SpcXjILK9hdVMHuwgoyCx3sLqpgT1EFRRXuqs4sUYEpsitEAnWNW+8DKg5+AWa9lqQoE0mRJpIizSRFmkiJMpMabSElOvDapK9vjIjGK0hWDAb0zZqhb9as0fZ5MoR8YNEzSlU7F50tC0VR8fmhuMJNfEQTGfhUCCGEEEIIIUST4PQ6WVuwlp2lOwNtDFCDj9XyHHlsKtzEluIth60m1yparAYrVqMVq8FKSngKraJa0SaqDa0jW5NmTUOv0TfGYYnTiOrzUfzBBwDEjBuLotEcYQ0hTk0+v0pOWSV7iyvZW+JgX7GDvSWV7C12sLfEQWG5m+ohJ6u/dKz+6tHrP7r+5UadBotBi8Wgw2zQEmXWEx1mIDbMQMwhU7NIE0lWM1azTr7kbESSRG9MkWkAKC47LS1udlUYybc7JYkuhBBCCCGEEGc4j8/DxqKN/J7zO6tyV7E2f+1RVZFXC9OH0Sm2E11iu9AprhMtrC2wGqxEGiOx6Bq2l7MQAPYlS/Hs24c2KorIyy4LdThCHBVVVXF5/Tg9Ppyeqkdv4LnD7SW3zMm+kkr2lTjYW1zJvlIHOaXOo06G1zXoZ0yYgRaxFlrEhdEyNizwGBdGQoQRc1XiXLpUNH2SRG9MBguEJUBFPp0sZeyqSCDf7qJzqOMSQgghzlB+/6FD2gjRcOTnSwhRF5fPRXZ5Nvvs+4KPO0t38lf+X7WqyRMsCXSN64pBYwAFFJRAX+Cq/yIMEXSO60yX2C60iGyBRpFKYNF4iufMASBq9DVozObQBiPOeAV2F1tzbWzNsbM1105BuQuHy0uF20elO/DocHlxeHx15bmPSK9VSIkykxZjITXaQlqMmbRoC2kxFhKtRrRVX1QeummzQYvVJHf6nA4kid7YoptDRT4djMX8jwTyZXBRIYQQotEZDAY0Gg379+8nPj4eg8EgFXqiwaiqitvtpqCgAI1Gg+EUGChJCNHwVFUluzybDYUb2FC4gc1Fm9lr30u+I7/edaKN0fRN6kvfZoGpubW5/P9JNEmONWuoXLsWRa8n5tprQx2OOE2pqoqt0ovN6aGs0oPN6cFW6cXu9GBzeskuqWRbXiBxXlThPubtazUKJp0Gk16LSa/FqNfQzGoiNdocTJSnRltIjTaTEGGSavEznCTRG1tUc9i3mha6AqAD+TZXqCMSQgghzjgajYaWLVuSk5PD/v37Qx2OOE1ZLBbS09PRSI9YIc4IZa4y1hesZ2PhRjYUbmBj4UZKXCV1LmvRWUiNSCU1PJXUiFTSItI4K/Es2kS1kWpycUoofm8OANb/G4EuPj60wYhTks+vUlTuItfmJM/mIqeskpwyJ7llTvaXVpJrc5JT5sTtPbo7+zQKtIgNo0NSBO0TraREmwk3BlqlVPcaDzNqMRu0mKuS5nqt/Hsrjp4k0RtbVDoAKWohAPl2SaILIYQQoWAwGEhPT8fr9eLz+UIdjjjNaLVadDoZ7EmI05Vf9ZNZlsna/LWsK1jH2oK1ZJZl1lpOr9HTIaYDXeK60CWuCy2tLUmNSCXKGCX/PohTlnvvXuxLlwIQO25caIMRIaeqKjsLylmxs4jfdxVT7vKi1yrotRp0Wk3guUaDRqNQXOEi1+Yi3+Yk3+7Cd5R9xs16LVazDqtJT4RJh9Wsx2rSEx9hpH2zCDo0i6BtQgRmg/YkH604k0kSvbFFNwcg3pcLQL5d2rkIIYQQoaIoCnq9Hr1e+hQKIYSoX6mzlA2FG1hfuJ4NBYFHu9tea7nm1uZ0jesanNrHtMeglZZO4vRS/P4H4PcTdu65GNu2DXU4ogH5/Crbcu2syiwi3+4iJsxAXLiRuHAjseEGYsMNxFgM5JQ5WbGzkBU7i1ixs4iC4ywQ1SgQH2Ek0WoiKdJEUqSZpEgTzQ56nmA1YtRJclyEniTRG1tUIIke5QrcOi6V6EIIIYQQQgjRdHh8HraXbGddwbpgP/M9tj21ljPrzHSJ60L3+O50j+9Ot/huxJhiQhCxOFWoqorqcKAJCwt1KMfNV1ZG6RdfABB747jQBiNOmMfnZ0N2Gasyi1mVWcwfu4uxOb3HvB2jTkOfFjH0bx1LotWE1+fH4/Pj8al4fH68/sBjTJiBRKuJRKuJZlYTceEGdNJSRZwiJIne2KrauVgc2YAqPdGFEEIIIYQQIkRUVSXPkce6gnWsL1gfHADU5av9d1oLawu6xnWlW3w3usZ3pX10e3Qa+ZNaHJnPZqNs4UJK/vMx7sxMzN27E3nlKKzDhqMNP7US6iWffIrqcGBs3x5L//6hDkccBVVVKXF4yCysYHdhBbuLKgLPiyrIyC/H6anZczzMoKVXixhaxloodngoKndRVO6mqMJFcYUbvwo6jUL3tCjObh1L/9Zx9EyPwqSXanFxepP/4ze2yDRAQeNzEoeNArsWVVWlH54QQgghhBBCnGSqqrKzdCer81bzR+4frM1fS35lfq3lrAZrMGHeLb4bXeO6EmmMDEHEoiGoPh9+ux1tVFSj7rdyw0ZKPv4PtkVfozoPtHKtXLeOynXryJs+A+vQoURdOQrzWWcdV15AdbtBp0NphEGsVbebkrlzAYi5cZzkMUJIVVXybC625trYnmcnI78cW6WXSo+PSrePSo8Ph9uL0+PH5vRgP0x1eZRFT98WMfRtGZg6JVnrrQ73+VVKHG7Mei1hRkkpijOL/MQ3Np0BrClg20eaks8aXySlDg/RYdInTwghhBBCCCEakqqqbC/Zzh95f/BH7h/8mfcnJa6SGstoFS3totvVSJg3tzZHo0iLgdOBa+dOsu+9F1fmbpJnTCdyxIgT2p63pATn+vVUbtqE6vGgMRpRDEYUoyHw3GjEX15O6RcLcG7YEFzP2LYtUaOvIfzss7EvWULp/M9x795N2YIFlC1YgKFFCyIGXwiKgt/lQnW5UV0uVLcLv8uNWlmJv6ICv6MCf4UDf0UFPocDPB4UvR59cjL6lJSDpsBrU8eOaMzmEzpmf0UF3uJi7N99hzc/H11CApHDh5/QNkX9VFXF5vRS6nBT4vBQUuGmxOGmuMJNZmEF2/PsbMu1H3PblaRIEy1iw2gRF0bLOAstYsNoFR9Oq7gwNJqj+0JEq1GICzcez2EJccqTJHooRDcH2z7am4pZUxnoiy5JdCGEEEIIIYQ4cS6fi1U5q1i2dxnL9i0j31Gz0tykNdE9oTu9E3vTK7EXXeK6YNadWJJRNE1lX31FzhNTUSsrAdj/0MOg0RB5ySVHtb7q8eDctp3KdWupXLcO57r1uPfU7o9fH0WvJ2LIEKKvHY25Z89g5Xbs+PHE3HwzlWvWUDr/c2zffot7926K3n7n2A+yKk73nj11xqaYTISfew4RgwcTPmgQ2si676jwV1ZSuW4djtV/4NyyBW9hIb6iIrzFxcHzVy36uutQDJLDOB5llR4277exp6iCogo3hQe1Sikqd1NYHkiY+/zqEbel1Si0jAujfbMI2iVEEBNuwKzXYjFoMeu1mKsew4xaUqIsmA3SbkWIEyFJ9FCISoc9y2lnKIZKyLc7ad8sItRRCSGEEEIIIcQpqcRZws/7fmbZ3mUs37+cSu+BpJ9ZZ+ashLPo3aw3vRN70zm2M3qtPnTBipPO73KR98x0Sj/9FABL/7+hT0ik7Msv2f/gQyhaLdahQw+7DfuPP5IzZQq+gsJa7xlatsTcrSua8IiqSvGaleOqz0/YOWcTNWoUupi6B5tVFAXLWWdhOessEh95BPu33+DcvBlFb0AxHlTZbghUt2tMRjRhYYHJYqnx3Gcvx5OdHZj27w8+d2dm4i0owL5kKfYlS0GnI6xvXyIuGkzYgAG49+zBsXo1jtV/ULlpE3g89Z4PxWRCFxuLsU0boq8dfQyfxpmrsNzFxuwyNu23sWl/GRuzbWQVO456fbNeS0yYgSiLnmhL4DE12kKHZhG0bxZBq/gwjDpJjAvRWCSJHgpRzQFooQv8z1gGFxVCCCGEEEKIo+fwOPgz709W5a7i95zf2Vq8FZUDlZsJ5gQGpQ3i/PTz6dOsD0attB84HXhLSnD8/ju6xMRAmxKTqdYy7j172Hfvfbi2bAFFIe7OO4m78w5QFNBoKFuwgOx/TAKNBuvFF9da319ZSd6zz1L68ScAaKxWzN27V03dMHft2uC91bXhYURdeeXxrx8ZiSE1pdZ8VVVxbdmCfWkgie7asYOKFSuoWLGizu3oEhOx9OmDuUcP9EnN0MXGoo2NRRcTg2KxSA/0enh9fnYVVrAlx8bmHBtbc+xsybGRb68715MabaZtQjjxEUZiw43EhhmICzcSG24gNswYTJzLQJ1CNC2SRA+F6EASPYXAbYV5dufhlhZCCCGEEEKIM5qqqqwtWMvy7OWsyl3FhoINeNWa/YA7xHRgUNogBqUNolNMpzM64ad6vaDRNMpgkyeb6vVS/uuvlH2xAPuPPx6oltZqMbZti7lrF0ydu2Dq2gXP3r3kPPY4/vJytNHRJM+cSfg5Zwe3lfT0U6g+L7av/kv2/f9AeWkWERdeGHy/csNG9j/4IO7MTABixo4l/v770BhPzS9hFEXB1KkTpk6diL/7bty7dwcT6pXr1qFPT8fSpzeW3n2w9OmNPiXljP69OVil28earBJW7S5m7d5SHC4fKiqqCirgVwPPnR4fuworcHv9tbahKNAyLowuyZF0SbHSOTmSzslWoizSCkeIU5Ek0UMhKh2AeG8eIJXoQgghhBBCCFEXh8fB/3b9j/9s/Q8ZpRk13ksOS6ZfUj/6JfWjb7O+xFviQxRl0+LKyCBr/C2oTicRF12EddhQLH37ouiO/8//ks8+o/D1N4i9cRzR119/wolW1e3GV1GBoiiBCme9vtY2XbsyKVvwBWULv8RbUBCcb2jdGl9pKb6iIlxbt+LauhU+m19jXXOvXqS88Dz6xMQa8xWtluQZM8Dnx7ZoEfvuvY/Ul18i/LzzKHrrbQpefRW8XnQJCST/cwZhAwac0HE2NYYWLYgdP57Y8eNRvd4T+pk4naiqSnGFm7V7S1m1u5hVmcVszC7D4ztyX/JqYQYtHZKsdGgWQcckKx2rnocZ5RwLcbqQ3+ZQqGrnEunORYOfgnpu8RFCCCGEEEKIM1GWLYv/bP0PX2Z8id1jBwK9zQelDgomzlMjUkMcZdPj3L6drHE34isuBqD0s88o/ewztNHRRFx8cSCh3rv3MSVPnVu2kDvtKfB4yJs+A8eaNSQ99TTa8LDDrucrK6Nw9r+p/PNP/A4H/ooK/BUV+ByO2r23tdpAn2+zGY3ZDBpNsBocQBsdjXXEpURdcQWmDh1QVRVvbi6VGzfi3LAR58aNVG7ahN/hIOaG60m4914Ufd197xWtluRn/4nq92H/5luy774HY7t2ODdtAiBiyBCSnpza4C1bmpozLYHu9fnZtN9GRn45+0sr2V9Wyb6SysDzUieVHl+tdZIiTfRtGUPvFjHEhhlQCFSXg4JGCVT66zQKreLDSIu2oNFIFb8Qp7Mz61/NpsKaDBodWr+XRErIt8eGOiIhhBBCCCGECClVVVm5fyVzt8zl1+xfgz3O0yPSuabDNVzW5jKsBmuIo2y6nNu2kzVuHL6SEoydOhJ/992U/7gM+3ff4SspofSTTyj95BO0sbHE3XUnMddee8Rt+p1Osh94ADwejO3a4dq1C/s33+Lauo3Ul1/C2LZtrXVUv5/Szz+n4IUX8ZWUHF3wPh9+ux2/3X5gnlZL+LnnEnnF5UQMGoRiONACQ1EU9ElJ6JOSsF50UWC/qorq8aAxHLlVhqLTkfKvf5Ht82P/7jucmzahCQsj8fHHiLzsMmlpchpwenys21vK6t3F/J5ZzJ97SnC4ayfKD9YqLoy+LWPo0yKGvi1jSI02y8+CECJIkuihoNFCZCqU7CZNySfPnhbqiIQQQgghhBAiJFRV5ZfsX3hz3ZtsKNwQnH9Oyjlc2+Fazk45G41y6vf2PpmcW7cGKtBLSzF17kz6O2+jjYoiYtAgmj3+GI5Vq7B98y32JUvwFRWRN+0pFJ2O6L///bDbzX/uedwZO9HGx5E+5z3ce/aQfe99uDMzyfz71SRNm0bkiEuDy1euW0fuU0/j3LgRAEOb1sTddhu6uDg0YWGByWIJPqKq+CsrA5PDgVr9vNKJqX07dPFH36JHUZQaifYjLq/Xk/L8c+TNmIG3oJCEhx7EkCp3N5xKKt0+cm1OcsoqyS1zklPmJLfMybZcO2v3luL21exTbjXp6JISSWq0meSowJRSNTWLNMlAnkKIw5IkeqhENYeS3aQqBay3OVFVVb7hFEIIIYQQQpwxVFXl530/88a6N9hUFGilYdKaGNVuFNd2uJZ0a3qIIzw1OLdsCSTQy8owde1K+ttvoY2MDL6v6HSEDRhA2IABNJvyOAUvv0LRW2+RO/VJtFFRWC++uM7tlv/yCyVz5wKQPH06upgYdDExtFzwBdn/+AeOlb+x/4EHqFyzhthbxlPw8iuULVgAgCY8nLgJdxEzZky9bVWqafV6tNbQ3GGg6PU0mzIlJPsWx8bvV9mcY2N5RiHLdxaxfl8ppQ7PYdeJjzDSt2UMfasqy9snRkjLFSHEcZMkeqhEN4dMSFMKcHr82F1erKbDX1wIIYQQQgghxKlOVVWW7V3Gm+vfZHPRZiCQPL+6/dWM6zKOOHNcaANsAlRVxW+z4Sspwe9yo09JRhseXmu5yk2byLrpZvxlZZi6dyP9rbcOm5BW9Hri778PX2kppZ99xv5JD6B9K4qwfn1rLOctKWH/I48AED1mDOHnnht8TxcTQ/rbb1PwyisUvTmbknnzKJk3L/h+5OWXk3D/fcdURS7EoVRVZXeRg18zClmRUcjKXUV1Js0tBi1JkSaSIgPV5EmRJtJiLPRpEUOLWIsUKwohGowk0UOlanDRVrpC8EG+zSVJdCGEEEIIIcRpye62sypnFSv2r2D5/uVkl2cDgcFCr2l/DWM7jyXWfGaOFeXcvJmi9+bgzc/HV1yMt6QEX2kpeL01ltNGRqJPS0OfmoohLRVdXBwFr72O32bD3L07aW+/hTYi4oj7UxSFZlOfwFdagn3JUvbdeSfNP/wAU6dOQCB5mfP44/gKCjG0bk3CA5Nqb0OrJeHeezH36MH+hx4OJPE7dSLx8cew9OzZIOdFnHl8fpU1WSV8tzmPJZvzyCysqPF+uFFHv5YxDGgTR7+WMaTHWogw6iRRLoRoFJJED5WqJHpzXRG4IN/upE1C7coCIYQQQgghhDjV+FU/Gws3smL/ClbsX8H6gvX41AOD+pl1ZkZ3GM3YzmOJMcWEMNLQKv/lF/bdfQ9qZWWd72vCwlB0OnxlZcGput94NXPPnqS99e86K9Xro2i1JD/3HHvH34Jj9WqybrmVFvM+wtC8OWWff0750u9Brydl5r/QmEz1bidi0CBaffUVru3bCRvQH0UrPaXFsXF6fPyyo5Alm3P5fks+RRXu4Ht6rUKv5tGc3TqOAW3i6JYaiV4r4yMIIUJDkuihEh1IoqeQD0CB3RXKaIQQQgghhBCiQazJX8OM32ewpXhLjfktrC3on9yfs5PPpk+zPlj0lhBF2DSUffkl+x99DLxewgb0J/KKUWijo9DFxKCNiUEbFYXGaATAV16BJ3sfnn2Byb038KhPTib+/vvRhocd8/41RiOpr7/GnhvG4tqyhazxt5D8zxnkTp8BQMI9dwer0w9Hn5iAPjHhmPcvzmwur493fs3k9R93Uu46cNdFhEnHBR0SuLhTM85rF0eE3LEvhGgiJIkeKlWV6LG+QnR4ybM5QxyQEEIIIYQQQhy/AkcBL/z5Av/b9T8ALDoLZ6ecTf/k/gxIHkBKeEqII2w6it55l/yZMwGwjhhB8jNPoxgM9S6vDQ9D2749pvbtGzQObUQE6W/9m93XjsGTlcWeMdcBYOnbl5gbb2zQfQkBgXZBSzbn8czXW9hT5AAgOdLERZ0SubhzM/q2jJFqcyFEkyRJ9FAJTwCdCY3XSZJSRL5NKtGFEEIIIYQQpx6Pz8PcLXN5c92bOLwOFBSuaHsFd59192nXqkVVVXyFhWgiIg7b5qTe9f1+8v81k+I5cwCIufFGEh6YhKIJXdJQFxdH+jtvs3v0tcFjS/7nDGnNIhrcjjw70/63mV92FAKQEGHk4WEdGNkjBY1G+poLIZo2SaKHiqJAVDoUbidNKSBf2rkIIYQQQgghTjErslcwY9UMdtt2A9A1riuP9HuELnFdQhvYUXBu3kzFb7+j6HQoRiOK0YDGaAw8NxhRnZXBtinufXvx7MvGs28fqsuFJiKCmBtuIGbsDWit1qPan+p2s/+RR7H9L1Cpn/Dgg8Te1DSqvQ1paaS/8w6Fr79O9Ohr0CcnhzokcRopc3h4cel2PvxtDz6/ikGrYfy5Lbnr/DaEGSUtJYQ4Nci/VqEU1TyYRN9jl3YuQgghhBBCiFNDgaOAf676J9/t+Q6AGFMM9551L5e1uQyN0nhV1f6KCsp/+omK1asxdeiI9ZLhRxxg07ltGwWvvBIYPPN492u3U/jaaxS//z4xN1xPzNixaCMj61xWdbupXL+ewtdfp2LFStDpSJ7+DJH/93/Hvf+TwdS+HakvzQp1GOI0k1NWyWWvLg8WDl7UKZHHLulI89hj7+MvhBChJEn0UKoaXDRNyWe1VKILIYQQQgghmji/6ueLHV/wwh8vYPfY0SpaRncYzZ097iTCENEoMfjKyyn/cRm2xd9S8cuvqK4Df0vlPfss1mFDibrySsw9eqAoB1pEuHbupODVV7F/821ghqIQft55aMLC8LtdqC43qsuF6nLhd7tRdDoMaanoU1LRp6ViSE1Fn5aGLjGR8h9+pPD113Ft307h629Q/MGHRF9/HbFjx6IJD8e5cSMVv6/C8ftvOP5ag+oMFE0pFgupL80i/NxzG+VcCRFKqqry4Pz15NtdtIi18NTILpzbNj7UYQkhxHGRJHooRaUDkKoUUCA90YUQQgghhBBN2K7SXTy58kn+yv8LgM6xnZk6YCodYjqc9H2rqor9uyWUffklFb/+iup2B9/TN08n/Oyzqfjtd9y7dlH2+ReUff4FxrZtAsn0s3pR/OEH2P63CPx+ACKGDSV+wgSMrVsfVzzWoUOIuPgi7EuWBpLp27ZR9MablLz/AQB+h6PG8trYWML69SV2/HhMnTod51kQ4tQy97c9/LKjEJNewzvj+tA6/vB3iQghRFMmSfRQiqquRC/A7vLicHuxGOQjEUIIIYQQQjQdbp+bdza8w1sb3sLj92DWmbm7592M7jAaraZxBp8smv1vCmbNCr42tGxJxNAhWIcMwdi+PYqioKoqlWvWUPrpZ9i+/RbXjgzyZvyzxnYiLhpM3ISJmNq3O+GYFI0G65CLibhoMPalSyl8/Q1cW7cCoI2MxNK3L5Z+/Qjr1xdDmzY1quKFON3tLqxg+teB34eHhnaQBLoQ4pQnGdtQqmrnkq4UAJBvc9EiTj4SIYQQQgghROj5/D6WZi3ltbWvkVmWCcB5qefxWL/HSApParQ4Sr9YEEygR19/PVFXXYmxbdtaSWlFUbCcdRaWs84i8dFHsP3vf5R+Nh/n5s2EDxpE3MQJmDt3bvD4FI0G68UXEzF4MJVr16ExmwKJfU3j9YYXoinx+VXu/3QtlR4fA1rHMrZ/i1CHJIQQJ0wytqFUVYker5RixB3oExYng2sIIYQQQgghQsfj8/C/Xf/j3Y3vstu2G4BYUywP93uYIc2HNGpFdfkvv5Dz+OOBGMbfTMKkSUe1njYigujRo4kePRrV50PRnvyKeUWjwXJWz5O+HyGautk/7+SvrFIijDpmXtUdjUbuwhBCnPokiR5K5mgwRIDbTqpSQL7dGeqIhBBCCCGEEGcoh8fB5zs+5/1N75PnyAPAarAypuMYxnQcQ6QxslHjqdywkX333As+H9YRI4i///7j2k5jJNCFEAFbcmy8uGQ7AFNGdCIlyhziiIQQomFIEj2UFCXQ0iVvI2lKAfkyuKgQQgghhBCikXl8HuZsmsMHmz+g1FUKQLw5nrGdx3JluysJ0zf+3bLurCz23n47qsNB2IABJD/ztLRHEaKJc3v93P/pOjw+lcEdE7myV2qoQxJCiAYjSfRQi0qHvI2kKgXkSSW6EEIIIYQQohHtse3hwZ8fZHPRZgDSItK4qctN/F/r/8OgNYQkJm9REVnjb8FXVISxU0dSXn4ZxRCaWIQQR++l77ezJcdGTJiBGVd0lcF0hRCnFUmih1pVX/RUpYDtUokuhBBCCCGEaCT/3flfnv7taRxeB5HGSB7q8xDDWg5Dpwndn4n+igr23nY7nqws9CkppM+ejTZcxo0Soqn7K6uEN5btBGD65V2IjzCGOCIhhGhYkkQPtehAEj1NyedXuyTRhRBCCCGEECdXhaeCp397mv/t+h8AvRN7M+PcGTQLa3bS9+0rLaXg9dep/GtNYIZGE6hWVRTQaPAWFeLZk4U2Koq0t95CFx9/0mMSQpwYVVV5aP56/Cpc3jOFoV2SQh2SEEI0OEmih1pUdRJdBhYVQgghhBBCnFybCjfxwM8PsNe+F42i4Y7ud3BL11vQak7u4Juq30/ZggXkP/c8vpKSwy6rmEykvfkGxlYtT2pMQoiGkVPmZEd+OTqNwtQRnUMdjhBCnBSSRA+1qHQg0M4lq9iBz6+i1UjfMCGEEEIIIUTDUVWVDzZ/wKw/Z+FVvSSFJfHsec/SM6HnSd+3c8sWcp+cRuXatQAY27Yh9vbb0YaHo/r9oKrg96OqKvhVzN26ok+SSlYhThWb9tsAaJsYQaRFH+JohBDi5JAkeqhVtXOJUcrReirYU1RBq/jwEAclhBBCCCGEOF34/D7+ueqffLztYwAuan4RT/R/gkhj5Mndr81GwcuvUDJvHvj9aCwW4iZMIOb661D0kmgT4nSxuSqJ3inJGuJIhBDi5JEkeqgZI8AcA5XFpCkFbM21SxJdCCGEEEII0SDcPjeP/PoIi3cvRkHhgT4PcF3H6wJ9yE+Q3+GgcuNGfKWl+O12fHY7flv1o43y5cvxFRYCYB0+jISHHkKfmHjC+xVCNC2bc8oA6JQsSXQhxOkrpEn0N954gzfeeIPdu3cD0LlzZ6ZMmcKwYcPqXeezzz7j8ccfZ/fu3bRt25Znn32W4cOHN1LEJ0lUOlQWk6oUsDXHxvCucuuiEEIIIYQQ4sRUeCq458d7+D3nd3QaHdPPmc6wlvX/rXU0PPn5lC9bRvkPP1KxciWqy3XY5Q0tW9Ls8ccIGzDghPYrhGi6NudIJboQ4vQX0iR6amoq//znP2nbti2qqvL+++9z2WWXsWbNGjp3rj0YxYoVKxg9ejQzZszg0ksvZd68eYwcOZK//vqLLl26hOAIGkh0c8hZS5qSz5Zce6ijEUIIIYQQQpziip3F3LH0DjYXbcasMzPr/FkMSD72RLaqqri276D8xx+w//AjzvXra7yvS0xEn5yMxhqBNsKK1hqBpupRl9gM68UXoRgMDXVYQogmpqzSw97iSkCS6EKI01tIk+gjRoyo8fqZZ57hjTfe4Lfffqszif7SSy8xdOhQHnjgAQCeeuoplixZwquvvsqbb77ZKDGfFFGBvuhpSgFLc20hDkYIIYQQQghxKssuz+a2Jbexx7aHaGM0rw9+nS5xR1d0pPp8OLdupfKPP3D88QeOP/7EV1JSYxlT165EXHA+4RdcgLFduwZpDSOEODVtrapCT4kyy6CiQojTWpPpie7z+fjss8+oqKigf//+dS6zcuVK7r///hrzhgwZwsKFC+vdrsvlwnXQLYY2WxNMUlcNLpqqFLC3uBK700OESf7nI4QQQgghhDg220u2c/uS2ymoLCA5LJnZF82mRWSLw66jer2UfPwJ5b/8TOWff+EvL6/xvmIyEdavH+EXXED4oEHoExNO4hEIIU4lwVYu0g9dCHGaC3kSfcOGDfTv3x+n00l4eDgLFiygU6dOdS6bm5tL4iED0SQmJpKbm1vv9mfMmMGTTz7ZoDE3uKpK9Ja6QvDAtlw7vVvEhDgoIYQQQgghxKlkde5q7vnhHuweO22i2jD7otkkWA6f8PYWFJB93/04/vgjOE8TFoa511lY+vTB0rs35s6dpSWLEKJOm/YHkuidJYkuhDjNhTyJ3r59e9auXUtZWRnz589n7Nix/PTTT/Um0o/V5MmTa1Sv22w20tLSGmTbDSauLQAt1P0YcbNFkuhCCCGEEEKIY7BkzxIe/vlh3H43ZyWcxcsXvEykMfKw6zj++ovse+7FW1CAxmIh7s47sPTvj6lDBxSttpEiF0Kcyjbvl0FFhRBnhpAn0Q0GA23atAGgV69erF69mpdeeonZs2fXWrZZs2bk5eXVmJeXl0ezZs3q3b7RaMRoNDZs0A0tqjmEJ6Ivz6OrsoutOW1CHZEQQgghhBDiFPGfrf9hxu8zUFG5MP1C/nnuPzHpTPUur6oqJR9+SN6/ZoLXi6F1a1JfeRljq1aNGLUQ4lTn9vrZkW8HpJ2LEOL0pwl1AIfy+/01epgfrH///nz//fc15i1ZsqTeHuqnDEWBtH4A9NZsZ2uuPcQBCSGEEEKIM9Frr71GixYtMJlM9OvXj1WrVh12+VmzZtG+fXvMZjNpaWncd999OJ3ORopWqKrKy3+9zPTfp6OiclW7q3h+4POHTaD7KyrY/49J5E2fAV4v1uHDaPnpJ5JAF0Ics4z8cjw+FatJR0qUOdThCCHESRXSSvTJkyczbNgw0tPTsdvtzJs3j2XLlrF48WIAbrjhBlJSUpgxYwYA99xzDwMHDuT555/nkksu4eOPP+aPP/7g3//+dygPo2Gk9YMtX9FLs525uXb8fhWNRka5F0IIIYQQjeOTTz7h/vvv580336Rfv37MmjWLIUOGsG3bNhISavfVnjdvHg8//DDvvvsuAwYMYPv27YwbNw5FUXjhhRdCcARnFo/fw7SV01iYsRCAu3rcxW3dbkNR6v8bwrUrk313T8SdsRN0OhIffIDo668/7DpCCFGfgwcVlX9HhBCnu5Am0fPz87nhhhvIyckhMjKSbt26sXjxYi666CIAsrKy0GgOFMsPGDCAefPm8dhjj/HII4/Qtm1bFi5cSJcuXUJ1CA0n/W8A9NbsoNzlYV9JJemxlhAHJYQQQgghzhQvvPACt9xyCzfeeCMAb775JosWLeLdd9/l4YcfrrX8ihUrOPvss7n22msBaNGiBaNHj+b3339v1LjPRA6Pg0k/TeKX7F/QKBqm/G0Ko9qNOuw63uJi9lx7Lb7SUnTx8aTMehFLr16NFLEQ4nR0oB/64cdfEEKI00FIk+jvvPPOYd9ftmxZrXlXXXUVV1111UmKKISadQOdiWivnVZKDltybZJEF0IIIYQQjcLtdvPnn38yefLk4DyNRsPgwYNZuXJlnesMGDCAuXPnsmrVKvr27cuuXbv4+uuvuf766xsr7DOS2+dm4g8TWZW7CqPWyMzzZnJ++vlHXK/gxVn4Sksxtm1D+rvvoouPb4RohRCns805ZYD0QxdCnBlCPrCoqKIzQEov2LOcXprtbM2xM6Rz/QOmCiGEEEII0VAKCwvx+XwkJibWmJ+YmMjWrVvrXOfaa6+lsLCQc845B1VV8Xq93H777TzyyCP17sflctUY/8hmszXMAZwh/Kqfx5c/zqrcVVh0FmZfNJseCT2OuF7lpk2Uzp8PQLOpUyWBLoQ4YaqqHlSJLkl0IcTpr8kNLHpGS+sLQG9lO1tz5Q8KIYQQQgjRdC1btozp06fz+uuv89dff/HFF1+waNEinnrqqXrXmTFjBpGRkcEpLS2tESM+9b3818t8nfk1OkXHi4NePKoEuqqq5D0zHVQV6yWXSAsXIUSD2FdSic3pxaDV0CYhPNThCCHESSdJ9KYkrbov+ja25tpDHIwQQgghhDhTxMXFodVqycvLqzE/Ly+PZs3qvjvy8ccf5/rrr2f8+PF07dqVyy+/nOnTpzNjxgz8fn+d60yePJmysrLgtHfv3gY/ltPVx1s/5p2NgXaYTwx4ggEpA45qPduir6n86y8Us5mEByadzBCFEGeQ6kFF2yaGY9BJakkIcfqTf+makqpK9NaaHMqKcnC4vSEOSAghhBBCnAkMBgO9evXi+++/D87z+/18//339O/fv851HA4HGk3NPye0Wi0QqH6ui9FoxGq11pjEkf2Y9SMzVs0A4K4edzGyzcijWs/vcJA/cyYAcbfegr6eL0SEEOJYSSsXIcSZRpLoTYklBuLaA9BT2cE2qUYXQgghhBCN5P777+ett97i/fffZ8uWLdxxxx1UVFRw4403AnDDDTfUGHh0xIgRvPHGG3z88cdkZmayZMkSHn/8cUaMGBFMposTt75gPQ/+/CB+1c+otqO4rdttR71u4Vtv4c3LQ5+SQkzV5yiEEA2huhJdBhUVQpwpZGDRpia9HxRuo7dmO1tz7fRMjw51REIIIYQQ4gxw9dVXU1BQwJQpU8jNzaVHjx58++23wcFGs7KyalSeP/bYYyiKwmOPPUZ2djbx8fGMGDGCZ555JlSHcNrJsmUx4fsJOH1Ozk05l8f+FjjnR8O9bx/F77wLQMJDD6IxmU5mqEKIM4xUogshzjSSRG9q0vrBXx/QS7OdRTkyuKgQQgghhGg8EyZMYMKECXW+t2zZshqvdTodTzzxBE888UQjRHbmKXYWc/vS2ylxldApthPPDXwOnebo/3zLf/ZfqG43lr/9jYiLLjqJkQohzjSlDjfZpZUAdJRKdCHEGULauTQ1VYOLdld2sSOnKMTBCCGEEEIIIRqbqqo8seIJ9tr3khKewmsXvoZFbwm+b//hR/beNYHiD+fiycuvtX7Fb79hX7IEtFoSH5l81NXrQghxNKpbuaTFmLGa9CGORgghGodUojc1sa3xmmIxOovQ5K5HVc+Ti14hhBBCCCHOIIv3LGbZ3mXoNDpevuBl4sxxwfe8hYXsf+gh/HY75d9/T9706Vh69SJi2FCsF1+MNjqavGemAxA9ejSmdu1CdBRCiNNVdSuXzkmRIY5ECCEaj1SiNzWKgpLeD4COns3sL3OGOCAhhBBCCCFEYyl1ljLj9xkA3NL1FtpF10yC58+cid9ux9CyJeaePUFVcfzxB3lPPc2O8way67KRuHbsQBsVRfzEulvzCCHEiZBBRYUQZyKpRG+CtM3/Btu/ppdmB1tzbKREmUMdkhBCCCGEEKIRzPxjJsXOYtpEtWF81/E13qtYtYqyL78CRSH52X9i7tYNT04OtsWLsX/zLZXr1uHeuROA+HvvQRspVaJCiIYng4oKIc5EkkRvitIClei9NNv4NMfGhR0TQxyQEEIIIYQQ4mT7NftXvtr5FQoKUwdMxaA1BN9TPR7ynnoKgKi//x1zt24A6JOSiB03jthx4/BkZ2Nb/B2ofqKuuiokxyCEOL25vD4y8ssBqUQXQpxZJIneFCX1wKfoicdGQdZWoG2oIxJCCCGEEEKcRA6Pg2krpwEwpuMYusd3r/F+8Qcf4tqRgTY6moT77q1zG/qUFGJvuvFkhyqEOIPtyCvH61eJsuhJijSFOhwhhGg00hO9KdKbKI/tCoA5d3WIgxFCCCGEEEKcbC+veZmcihxSwlOY2HNijfc8ubkUvPYaAAmT/oE2KioEEQohRM1WLoqihDgaIYRoPJJEb6J0LfoDkF6xHqfHF+JohBBCCCGEECfL2vy1zNsyD4Apf5uCRW+p8X7ejH+iOhyYe/Yk8vLLQxGiEEIABw0qKv3QhRBnGEmiN1GW1gMA6KVsZ0deeYijEUIIIYQQQpwMbp+bJ1Y8gYrKZa0vY0DKgBrvl/+6HPvixaDR0OyJKSga+RNOCBE6wUp06YcuhDjDyBVYE6VUDS7aTpNNRtbeEEcjhBBCCCGEOBn+vf7f7CrbRawplgf6PFDjPb/LRe5TgT7p0deNwdShQyhCFEIIAPx+NViJ3jk5MsTRCCFE45IkelMVHk+RMQ2Ayl2/hTgYIYQQQgghREPLKMngnQ3vAPBIv0eINNZMShW98w6ePVlo4+OInzixrk0IIUSj2VdSSbnLi0GnoVV8WKjDEUKIRiVJ9CbMFt8LAIsMLiqEEEIIIcRp59W1r+JVvQxKG8RFzS+q8Z57716KZv8bgMSHHkYbERGKEIUQImhzThkA7RMj0GslnSSEOLPIv3pNmL5qcNHU8vWoqhriaIQQQgghhBANZXPRZr7P+h4FhfvOug9FUYLveUtK2HfnnaguF5Z+/bBeMjyEkQohRECwH7oMKiqEOAPpQh2AqF98p3PhV+isZpBfWk5itFSfCCGEEEIIcTp4fe3rAAxvNZxWUa2C8312O3tvHo9rRwa6hASSnnmmRoJdCCEag9fnJ6fMyd5iB1nFDvaWOPjf+hxABhUVQpyZJInehBmbdcRGOFalnM1bfiNxwEVHXkkIIYQQQgjRpG0o2MBP+35Cq2i5o/sdwfl+h4O9t92Oc/NmtNHRpL/3LobUlBBGKoQ4FZW7vHy5Npv/rtsPQKLVREKEkUSrifiqx5gwAyUVbvLsLvLKnOTZnMHnObZK9pc68fnrviO+V/PoxjwcIYRoEiSJ3pRpNOwJ60LXit9w7loJkkQXQgghhBDilPfa2tcAuLTVpTS3NgfA73Kxb8JEKv/6C43VSvq772Bs3TqUYQohTjGb99v46Pc9LFyTTYXbd8LbM2g1pMaYSYu2kBZjJj3GQteUKLqkRB55ZSGEOM1IEr2JK4/vBRW/EZH7W6hDEUIIIYQQQpygNflrWL5/OTpFx23dbwNA9XjIvu9+KlasQLFYSP/3bEwdO4Y4UiFEKNmdHjbvt7Ehu4xN+22Uu7wkWo0kRpgCleVWIwkRJmLDDfy6o5C5v+9hTVZpcP1W8WFc2zed+Agj+TYXeTYn+fYDj8UVbqItehKsge01swYq1BOtJppFmkiLtpAQYUSjkXZSQggBkkRv8vQdh8Du1+hY/jtqRSFKWFyoQxJCCCGEEEIcp+oq9MvaXEZaRBqqz8f+hydT/sMPKEYjaa+/jrlHj9AGKYRoVH6/ytp9pazKLGZjVdI8s7DimLej0ygM6dKMMf3S6d8qVsZTEEKIBiRJ9CauU8+z2bSoBZ01uyn+/SNiLrgn1CEJIYQQQgghjsPq3NX8nvM7Oo2OW7vdiqqq5E6dim3RItDpSHlpFmF/6xfqMIUQjcDp8bE8o5Alm/NYuiWfwnJXrWVSosx0TrbSJSWSaIuefLsrUFVud5Jnc5Fvc1JU4SYlysy1/dK5qncqCRGmEBxNIyvMgL2/gzkawhMhPCEw6YyhjkwcK3sebFsEWb+B3wuKBlACj0rVo94MCR0hqQckdAKDJdRRizOUJNGbOItBx2+Rw+hsfwNlzVw4/+7APyRCCCGEEEKIU4aqqsEq9FFtR5Ecnkzx++9T+tl80GhIeW4mEYMGhTZIIcRJo6oqe4ocrNpdzNLNefyyo5BKz4G+5RFGHWe3iaN7WhRdUqx0To4kJsxwxO16fX60GuX0rzp3lcPmL2HNh5C1su5lTFGBpHpYHBjCwRgOhjAwRFQ9Dwdz1IHEe1gChMWD7sjn+bBUFSoKoTQLSvdUPWaBoxD0loNiCQdjxIFHSwyYYw48nmgch/JUQuEOKN4FXif4PIFEtd9b9dwDqh+0hkMmfeALCa0BNFrQ6APzNHrQ6gKPEFjf5616rNqe3xf4HCJTIaJZYP1DFWfC1v/Blv8Fvgyh7gFs66RoIK49JHWDpO6B55bowD7N0WCKrHufB1NV8LrAWxk4R9WT1xmYH98BwmKPPiYIHPeR9itOeZJEPwW4Oo7C9ftbRNu3Q846SO4R6pCEEEIIIYQQx+C3nN/4M+9PDBoDt3S9BVdmJvkvvAhA4uTJWIcODXGEQoiGUp0w35BdxsbsMtbvK2Pj/jLsTm+N5ZIjTQzulMhFnRLp1zIWg05zzPvSaY99nUalqpC3ESpLDkkih4M+DDSHiV9VYd8fsOYD2PgFuMsD8xUNpPULJDzL86E8L5DAdZYGpsJtxxajOSaQWNcZATWQWFYJPKIG4qiP3wNl2YGE7IkyhFfFkhBIQkelQWRa4HlkauC5zgg+N3jdgcfqyeOAol1QsAXytwYeS3ZXHUOIaHRgTa46hrTAlwWZv0DehprLJZ8F7YYGEuDBc+6vmtTAZ5q7IZAPqygIHFvBFlj/Sd37NUYGvizR6g85Vx7wuQLPjySxC7Q4F1qeB80HBLZXzesKxLJ3FexbBXtXQ3kuxLSGxM6BdRM7Q7MugeM+mi+43A6wZUPZXijbF/iZUv2gNwW+iNFVPVa/NloD56t60pubRsGtqoKjKPA5RTU/7e4akCT6KaBXh1Z8t7I3I7S/oa6ZiyJJdCGEEEIIIU4ZB1eh/73930kwxbFn8nWoLhdhAwYQfd2YEEcohDgWe4sd/LS9gDybk7JKD6UOD6WVHsocbkorPRTaXVS4fbXWM+g0dEqyMqh9PIM7JtI52Xr6VpDb9geSnGvnQeH2+pfThx2oetZVV0IbAwlQZxmUZB5YNqYV9LwOuo8OJGerqWogSV+dUHcUgbsikHR3lYPbHnjtKofK4sAy5fmBSfUF5lUWn+ABKwcSxlHpgSk8IVDhHIyj/MBzlw0cxYFYnaWBhGn1+2VZkP3HCcZTxRwNsW0DFfk1qsmrKsoVTVUleR2JeZ+7qmr94Grzqip2Ranahq5qu1Xb02gDx2XLDixbXZVf41RpA4npjv8HHS6ByJSjOxZVBXsu5K4PJLFz1gW+KKgsDZzD6i9ZXGWB6Wgo2qrktDmQoEYJ3E2QtzEw/f5G4Bw16xaofs/fCjlr607EF+0ITJsXHphntAaSyRptYFK0VedKG9iuszSQNHcUHV289dHoA8l0czREt4C4thDbGmLbBKaI5MN/YVWX6op9d0XVObUfmJy2wM+wPbcq+b8v8GjbH6joh8BxJnaBtL6BL71S+wR+L6r/zVPVwO9icWbg97z6ceDDENfmxM7HSaKo6uG+Ujv92Gw2IiMjKSsrw2q1hjqco+L2+rn9yZm8q52OzxCJ9oHtVb/cQgghhBDiVHMqXo+eLGfKufg1+1fuWHoHJq2Jb0Z9gzLvK/JnzkQTHk6r/36FPikp1CEKIQ5DVVU2ZJexdHMe323OY2uu/YjrGHQaOiZZ6ZpipWtKJF1SImmXGIG+qVeOnwhPJWxdFEic7/rxQBW0zhyoqq5OZLvtR18hrTND55GB5Hnzsxu22tbvr0q+5wUmn/tAL+6D+3Kj1L9fRRNInltTj78di98fSKZWlgQS0PacqmrkfVWVyVXVyRUFNdfTHvzlgzGQoEzoAPEdDzyGJ4SmQtnvCyRYg8ewL3COEztDu2HH3i7laHjdgS9eqs+lz1P1BY3+wBczwS9sTIHEuVZfezvlBbD7F8j8OfBYlFF7GUvsgcRwWt9AorxwO+RtqkrAb4KCbYEvH46WIfygOw9SAolxT2XttjMeR1UiuywwqbW/sKtFbwFrSiCxHew3rxzoQa/6wOOsvb9jabVT41giAr/nhwpPDPS1L88LfAHicdRe5u8fQqf/O779HqejvR6VSvRTgEGnwdv8XPbtjSPVXRjoHdX1ylCHJYQQQgghhDgCVVV5dc2rAFzT4RoiskvJfOklABInPywJdCFCRFVVdhZUsCqzmHy7E71Wg16roNdq0Gk1GLQKGkVh3b5Slm7OJ9fmDK6rUaB3ixg6NIsgyqzHatYTZTEQZdYTZQk8bx5rOb0T5of6aSaseKVmBXB6f+hxLXQaCaaDElOqGqhWrU6oe91VbTaqK6KrnqNC+t8CFbYng0YTSOaGxUJip5Ozj6ONw1LVGz22df3LeZyB6m6dsSoZ2oTvYtBoA4ngyBSgkQbM1hkgPD4wnYjweOhyRWCCQHV15i+BFjJx7QNJ85hWtc9/VBq0ufDAa687kFgvzw18UeL3BpLVft+BR0P4gbY9pshj/0xVNfDlVHVCvaIg0AO/KAOKdgYq46uT1UU7jv+c6MMCv8PGiKqp6nl4YtUdGKmBJL01OTBpDYEvTvatCrS92bsqcAdB9RdW1RRN4AuomBYQ3RJiWgYGkf1/9u47vul6++P4K0n3XnSXlr33BkVQBBRFxL1wT3B7r+LeOK/75xYVBVERRGTIEJAte+9RKG2he8/k98engMgq0DYd7+fj8X3km2++4yS3XJOTk3OqKSXRa4gejcOYsLs3D7r8Aqu+UxJdRERERKQGWJ68nA2pG/B08eSW5jex/9YROIqK8O59Lv5Dhzo7PJE6w253sPVANst2pbF0ZxpLd6WRklNY7uO93Gyc19S0YTm/eSiB5Rj6WWfkp8OfL5t1/xjTbqXdtSdOCFssZe0zPIGzTHjWJepI4Bx+kdDumtM/zsXN9EWndYWHdJjFYuYLuPscaYvT8Lyj9yktNi11svb/q+d8Wb9/h918kePieeTfpatn2X0Pk0C3nUH6OCDGLK2vMPeL82H/KjPs1i/SJM0D6lf8QN1KpCR6DdGrcTD3zTBJdMfOuVgy4s0fm4iIiIiIVFuTd0wG4OIGF+P4fhIF69Zh9fUl4qWXam8vZJFKkldUwpzNB3A4wMfDBV93F3Pr4YqPuwuuNgtJmQUkZOSTkJ5/+HZfRj7bkrNJzzu6tYKbi5UOMQE0CvWhtNRBcamdYruD4hI7xaV2ikrt1A/yol/LMHo0DMbD1eakZ17N7V9lbgPj4P5Vp997WUQqj821rD/6SX7lUBVcPU0v/Niezo3jLCiJXkO0ivQnyz2ShaWt6GXbAKvHQZ/HnR2WiIiIiIicQH5JPjP3zARgMO05+OGzAIQ99SSuYWHODE2kRrHbHUxclcAbMzaTnFX+6vF/83S10Sk2kG4NgujaIIh2MQFKjFeEhBXmNqqTEugiUmspiV5D2KwWujcM5sfN55Ul0b+D3v/Rf6BERERERKqpuXvnklucS4xnJAFvjaGwuBifvn3xv+wyZ4cmUmMs25XGy79vZO0+02s7KsCTmCBPcgpLyC4oIaeghOzCEopKzKBKLzcbUQGeRAV6EhngSVSAJ9GBnsQGe9Mq0q9u9SmvKgllleiRHZ0bh4hIJVISvQbp2SiYURu7kmv5Bu+MeDMl+N+9jkREREREpFr4bcdvAAxfG07hxmXY/P2JePEFtXERKYf41Dxem76JqeuSAPBxd2F438bc2ivuuNXjhSWlFJXY8XF30b+xqrZ/pbmN6uTcOEREKpGS6DVIz8YhFOLG5NIeXGedZQaMKokuIiIiIlLtpOSnsGj/IiJTHTScaFodhD3zDC71NERP5HiKSuzsTs1lW3IOf+9OY+zSeIpK7VgtcG3X+jxyYVNCfNxPeLy7iw13F7VmqXJZ+yE7ESxWiGjr7GhERCqNkug1SJNQH0J83BmXex7Xuc+CTZMh/03wDHB2aCIiIiIi8g/Tdk2j1FHKPYt9oDQTnz598Bt0sbPDEqkyWQXFbE3K5mB2IaUOB6X2I4vd4aDUDomZ+WxLzmHbgWx2p+ZRanccdY5zm4Tw1KAWNA/3c9KzkFNKKKtCr9cC3LydG4uISCVSEr0GsVgs9GwUzOQ1DUnxakRI3g5YPwG63O7s0ERERERE5B9+2/EbTRIcNF+XCVYroY89qhYTUiuV2h1sP5DD5qQstiRlszkpmy1J2SRk5J/2uXzdXWgc5kPjej5c3DaCPk3r6d9NdXe4lUsH58YhIlLJlESvYUwSfT+/WS/gVnaYli5KoouIiIiIVBvb07ezKXUjz881gw79hwzBvXFjJ0clUnGKS+0s3pHKtPVJzNyYREpO0XH3i/D3ICrAE5vVcnixWiy4WC1YrRZCfNxoEupLkzAfmoT6EubnrqR5TZOgfugiUjcoiV7D9GocAsDHaZ24xcMFy/6VkLwBwlo5OTIREREREQH4bedvtN/poGW8A4ubG/XuH+HskETOWkFxKfO3HmT6hiRmbUwmq6Dk8GPebjaahfvSLNyPFhG+NAvzpXm4H/5erk6MWCqdwwH7V5n1yI7OjUVEpJI5NYk+atQofvnlFzZv3oynpyc9e/bk9ddfp1mzZic85uuvv+bWW289apu7uzsFBQWVHW61EBPkRXSgJ/vS4WDk+YTu+wNWjoGLXnN2aCIiIiIidZ7dYWfq9ik8UlaFHnjjjbhGRDg5KpEzU1xqZ8G2FCatTmDmxmTyikoPPxbi40b/VuEMbBVOj0bBuNqsToxUnCJtJxRkgM1dhX0iUus5NYk+b948hg8fTpcuXSgpKeHJJ5+kf//+bNy4EW/vEw+k8PPzY8uWLYfv17Wfe/VqFML45XuZ4zmAa/kD1v4A/Z4HVw9nhyYiIiIiUqf9nfQ3TZYnEXcArL6+hNx1p7NDEjktDoeDFXvS+XX1fn5fl0ha7pFWLZH+HgxoHc5FrSPoFBuIzVq3PovLvxxq5RLeBmz61YGI1G5OTaJPnz79qPtff/01oaGhrFixgt69e5/wOIvFQnh4eGWHV231bBzM+OV7+T6lMdf6RUPWPtg8Bdpc6ezQRERERETqtN83T+Ka+aYKPfiOO7AFBDg3IJFyKCqxs3pvBn9uOcBva/azL/3IUNAQHzcuaRvJ4PaRdIgJqHNFbHIS+9UPXUTqjmrVEz0zMxOAoKCgk+6Xk5NDbGwsdrudjh078uqrr9KqVd356VCPhsEArE/KJb/vdXguehNWfqMkuoiIiIiIE+WX5FM6aRqhmeAIDiBo2E3ODknkuOx2B1uSs1m4PYUF21NYtivtqFYt3m42BrQOZ0j7KHo2CsZFrVrkeA4PFVU/dBGp/apNEt1ut/PQQw/Rq1cvWrdufcL9mjVrxldffUXbtm3JzMzkrbfeomfPnmzYsIHo6Ohj9i8sLKSwsPDw/aysrEqJvyqF+nnQJNSHbQdyWOI3kL68Bbvmm35kQQ2dHZ6IiIiISJ305+apXPqX+ewRfv+DWD09nRyR1HUOh4ODOYXsSc1jd0oue1Lz2JmSw7JdaaTkFB21b7C3Gz0aBTOwdTj9WoTh4WpzUtRSI5SWQOIas66hoiJSB1SbJPrw4cNZv349CxYsOOl+PXr0oEePHofv9+zZkxYtWvDpp5/y0ksvHbP/qFGjeOGFFyo8Xmfr2SiYbQdymJPkQd/GF8D2WbDyW9MbXUREREREqlzyl5/TIA/ywv0JvOIKZ4cjddS6fZl8v3QPa/Zlsic196gK83/ydLXRrWEQvRqF0KtxCM3DfbGqx7mU18FNUJIP7n4Q3NjZ0YiIVLpqkUQfMWIEU6ZMYf78+cetJj8ZV1dXOnTowPbt24/7+MiRI3nkkUcO38/KyiImJuas4q0OejYO4ZvFe1i4IwUuutkk0Vd9D32f0kAPEREREZEqdiBhG+1m7wEg4MERWFz1nlyqTnGpnWnrk/hm0W5W7Ek/6jGrBaICPYkL9iY22IvYIG/aRPvTsX4gbi5q0yJn6FArl8j2YNXfkYjUfk5NojscDu6//34mTpzI3LlzadCgwWmfo7S0lHXr1nHxxRcf93F3d3fc3d3PNtRqp3uDYCwW2Hkwl6TwvoR714PcA7B1OrS41NnhiYiIiIjUKRvffoGwItgf48X5Q25wdjhSR6TkFDJuaTzfLd1DcpZpJeRqszCoTQSXtI2kYT1vogO9lCyXindoqKhauYhIHeHUJPrw4cMZO3Ysv/76K76+viQlJQHg7++PZ1n/wGHDhhEVFcWoUaMAePHFF+nevTuNGzcmIyODN998kz179nDHHXc47Xk4g7+XK60j/VmXkMniPZlc3v56WPieaemiJLqIiIiISJUpSUsjeIZJKOXfeSUWi1piSOVIySlk3b5M1u7LZO2+DP7alkJRqR2AEB93buxen+u71SfU18PJkUqtp6GiIlLHODWJ/vHHHwPQp0+fo7aPHj2aW265BYD4+His//hpUHp6OnfeeSdJSUkEBgbSqVMnFi1aRMuWLasq7GqjV+MQ1iVk8ufmg1ze/2aTRN8+CzL3gf/ptcUREREREZEzs+enb3EpdbAjwsI5g+91djhSSzgcDjbsz2Le1oOs25fJuoRMEjLyj9mvfUwAt/aK46LWEao4l6pRnA/JG8y6KtFFpI5wejuXU5k7d+5R99955x3eeeedSoqoZrmwZRifzNvBnM0HKLyqLe5x58Luv2DVd9DnCWeHJyIiIiJSJ2RMnIgXsOucBlziEeDscKSG23Ewh8mr9/Pbmv3sTMk96jGLBRqGeNMuOoA20f50iQuidZS/kyKVOitpHThKwbueCvhEpM6oFoNF5cx0iAkg1NedA9mFLNqeSt+Ow0wSfeUY6P0fsNqcHaKIiIiISK1WsHEjXrsPUGyDkEuHODscqaH2Z+QzZe1+Jq/Zz/qErMPb3V2s9GlWj86xQbSJ9qdVpB++HhpaK052uJVLJ/PNjohIHaAkeg1mtVoY0CqcMUv2MH19En0vGwwe/4GsfbBjDjS50NkhioiIiIjUagd++gGAv5ta6N9ioJOjkZrEbncwd+sBvlm0h3lbDx7e7mK1cG6TEAa3j+TCluH4uOtju1QzGioqInWQ/mtcww1sbZLoMzcl88rlrXFpdy0s/QRWfqMkuoiIiIhIJbIXFZE15XdswJbuUdzuG+PskKQGyMgr4qfl+xizZA/xaXmHt3dtEMTgdpFc3CaCIG83J0YocgoJK8ythoqKSB2iJHoN17VBEAFerqTlFvH37nR6dBxmkuhbpkHOAfAJdXaIIiIiIiK1Us6fc7Fl55HmA5HnX+TscKQaOzQk9Lsle5i0OoGCYjsAfh4uXNMlhhu7xxIb7O3kKEXKIT8DUrebdVWii0gdoiR6Dedqs3JhizB+WrGP6esT6XFZa4jqDAnLYfX3cM7Dzg5RRERERKRWSp84AYB5bSxcHHu+k6OR6ia3sIRFO1KZt/UAc7ccZF96/uHHWkT4cXOPWC5rH4Wnm2ZZyVnITQU3L3D1rJrrJa42twGx4B1cNdcUEakGlESvBQa2DuenFfuYsSGZ5y5thbXTzSaJvvJb6PWQBn2IiIiIiFSwkoMHyZ2/AAuwqlMAj4e0cXZIUg1sP5DN7E0HmLf1IH/vTqO41HH4MTeblQtbhXFLzzg6xwZi0ec0ORNFeRC/CHb8aWahHdgIwY3hthngHVL51z88VFRV6CJStyiJXgv0ahyCt5uNpKwC1uzLoEOroTB9JKTthJ1/QiNVxYiIiIiIVKTMyb9hsdvZEgVN2/fFZlU1cV1ltzuYs/kAXy7YxeKdqUc9Vj/Iiz7N6nFe03p0bxiMt4aEyplI3w0bfzVJ8z2LobTw6MdTt8PYa+Dm30xVemXSUFERqaP0X/BawMPVRt/moUxZm8j0DUl0qN8C2l8Pyz6DWS9Agz5gtTo7TBERERGRWsHhcJDxyy8AzG1j5ZKYvk6OSJwhr6iECSv2MXrhbnam5AJgs1o4t0kIfZrW47xmocQFe6niXM7Oxskw8W4oPjKEFr8oUyzX6Hzwj4GxV5lfo/9yJ1z9LVTml3qqRBeROkpJ9FpiYOtwpqxNZMb6JJ4Y2BxL7//A6nGmX9naH0xSXUREREREzlrB+vUU7dhBoQv83cqNVyN7OjskqUKJmfl8u3gPY5fGk5lfDICvhwvXd63PzT3jiAyoot7UUrs5HLDgHZj9grkf1RnaXGUS5yFNjm7beu1Y+PYy2DwF/ngaBo6qnJiykyErASxWiGhfOdcQEammlESvJfo0C8XNxcru1Dy2JGfTPDwUej8Ks56H2S9Cy8vATdPeRURERETO1qEq9GXNLLSJ64aXayW3TxCnS8osYOq6RKatT2T5nnQcZa3OY4O9uK1XA67sFK1WLVJxSgrhtwdhzThzv+tdMGAU2E7wNxbbEy7/BH6+DZb8n6lO73HfmV07O9n0XA9uDKEtj65qP9TKJaQZuPuc2flFRGoo/Ve+lvBxd6F3k3rM2pTMtHVJNA/3g273wvKvICMeFr4PfUc6O0wRERERkRrNXlhI1u9TAZjbxsLgmD7ODUgqzf6MfKatT2LqukRW7Ek/6rFuDYK47ZwG9GsRhs2qdi3Vmt0Oyz6FpHUw4BXwDHROHKUlkLTW9DeP6giBccffLzcFxt8I8YvBYoOLXoeud576/K2vgIy9MOs5mPEk+EdDy8Hlj8/hgJXfwh/PQGGm2ebma2KN6QYxXWHXfLNdrVxEpA5SEr0WGdg6nFmbkpmxIYmHL2wKrh5w4Yvw0y2w8D3oOAz8o5wdpoiIiIhIjZUzezb2rCxS/GB9nIW3o89zdkhSwZbsTOWDOdtYuP3oIaGdYwO5uE0EF7UJJ8JfLVtqhJyDpp/4jtnmvtUFBr9/9uctzIHdf5nEs08oeIeAd+jRQz2LcmHfcohfYiq79/4NxblHHg9sAA37QKO+0KC3Se4f2GQGhGbsAXc/uOpraHxB+ePq9aApolv+pemP7hsBMV1OfVzaTlP5fihJHhALealQlA275pnlnyI7lD8mEZFaQkn0WqRfi1BsVgubk7LZlZJLgxBvaDkE6vcw32LPfhGGfursMEVEREREaqyMXyYCMK+1haZBzYnwiXByRFIRHA4Hi3ak8t7sbSzblQaYltNdYoO4uE04A1tHEO7v4eQo5bTsXgA/3w45SeDiASUFsPIb6HBT+RLL/1acD9tmwoZfYMt0KMk/dh9Xb5NQd/OBlC1gLzn6cQ9/U4GevAHSd8GKXbBi9JEe46nboTDL7HP9j1Cv2enFaLHARW9A5j7YNgPGXWMGjUZ1NkV2/2YvNe1f5rxino+LJ5z/NHS/1zx+YBPsWwZ7y5a0HWBzM33ZRUTqGCXRa5EALzd6NAxmwfYUZmxI4p7zGpn/iA54BT4/3wwY7XYXRHVydqgiIiIiIjVOcXIyuYsWATC3rZXLYlSFXtM5HA7+2pbC+7O3sbysZYubzcrVXaK557xGRAeq332NYy+Fv96GuaPAYTf9u6/6GhZ/BKu/gykPw11zT9xf/J9KimDnXFg/ATb/biqzDwmMA88g034l94BJ0hfnQsY/qs39okxRW2wPc1uvBVitUJgNuxfCzj/N+Q9uPtJvPLYXXD0GvIPP7PnbXODKr+DrQZC42txaXcy1I9uZZH1Ee9Pr/PdHj1y3QW+49D0IanjkXOGtzdL5NnM/N8W8pj6hZxabiEgNpiR6LTOgdTgLtqcwfX1ZEh1M0rzttSaJPv1JuG360ZO8RURERETklDIn/Qp2O1vq20gOtNA3pq+zQ5Kz8Ne2g7z9x1ZW780AwM3FyvVd63P3eQ3VrqWmyjkAE+440n6k3fUw6C1w84YLX4DNUyB5Hfz9+ZFq6xNJ2wnfXAaZ8Ue2+cdAqyGm/3hE+yOfqx0OKMqB3IOmhUxBJoQ2h4D6xz+3uy80G2gWgKz9JplemA2dbgUXt7N4ETBDP6//Eab911Tk56WY5528DlZ99699/WHAy6ZC/1R5Au+Qs4tLRKQGUxK9lhnQMoxnf13P6r0ZJGbmH3nzd8GzsPFX2LsENk6CVpc7NU4RERERkZoma8oUAGa3cRDiWY+WwS2dHJGciQ37M3lt2mb+2pYCgIerlRu6xXJ374aE+qllS41jLzUV1zvnwdJPICcZXL1g0NvQ/voj+3mHmET6bw+a9iUth4DfCdoxZSfBmMtNAt27nkmatxoK0V1MJfm/WSwmMe7ue3Qld3n5RR4da0XwDYOrvzEJ/qwE2L/avE6HbnMPQvNL4OK3Tvw6iIjIYUqi1zKhfh50qh/I8j3pzFifxC29GpgH/KOg1wMw73WY+Rw0vej4PdFEREREROQYJWlpFG7bBsDyxhYGRJ+H1XKcZJpUWwkZ+bz9xxYmrkrA4QBXm4Wbusdxb59G1PN1d3Z4Ul4OB6RsNUnzXfPMgM+CzCOP12th2reENj/22A7DTCX2vr9hxpNw1ehj98nPgO+ugPTdZvjnbTNMQrqmsljAP9osLS4x2xwOKClUTkBE5DQoiV4LDWwdzvI96Uzf8I8kOphJ3Su/NZO+l34C5zzktBhFRERERGqS/FWrAEgMdSXHy8F50eqHXlNk5hfzf3O3M3rhbopK7ABc2i6S//RvRv1g9TyvMUqKYPmXsOgDU1n9T+5+EHeOGXjZ/gZwO8H/rlYrDPoffHaeGRDa8aajh2QW5cG4ayF5PfiEwU0Ta3YC/UQsFiXQRUROk5LotdCAVuG8/Psmlu1KIzWnkGCfsqoKN2/T1mXSvTD/LWjczwwJERERERGRk8pbYYbvrY8swd3mRffI7k6OSE4lt7CEbxfv4dP5O8jIKwagW4Mgnry4Be1iApwbnJSfw2Fak856HtJ3mW02d6jfDRqcBw37mP7k5RkUChDRFrreDUs/ht8fg3sXmYRyaTH8fCvELzZ9wm/8BYIanPp8IiJSJyiJXgvFBHnRKtKPDfuzmLo+iZu6xx55sO21sHw07FsGoy+Ca8aYNx0iIiIiUuPExcVx2223ccstt1C//gkG2EmFyF+xAoDN0Ra6R3TH00WDJ6urnMISvl28m8/n7yS9LHneJNSHkRc3p2+zUCynGp4o1cfeZTDjKfP5FcA7FPo+Ce2uBdez+DfY90nYMBHSdsCi9+Hcx2Dy/bB1Orh4wPU/qOBMRESOoiR6LXV5hyg27M9i/N/xRyfRrVa44Uf44UbYs8D0ervsI/MmRERERERqlIceeoivv/6aF198kb59+3L77bdz+eWX4+6u/s4VyZ6fT/7GjQBsjrFwb4xauVRHOYUlfLNoN1/8dSR5HhfsxYjzmzCkfSQutjrUwz5hBVhdTdW1U+NYCckbTMLb1dMkqF29TOW3qxdYXcBiNe1FLFag7LYgA+a9ARsnmfO4ekHP+6HnA+Duc/ZxefjBwFfh59vMr7TTdsKacWCxwVXfQGzPs7+GiIjUKhaHw+FwdhBVKSsrC39/fzIzM/Hz83N2OJUmLbeI7q/OpqjUzm8jzqFNtP/RO5QUmrYu6yeY++c/bb59V1WGiIiISKWqjPejK1eu5Ouvv2bcuHGUlpZy/fXXc9ttt9GxY8cKOX9lqSnvzXOXLiP+5ptJ87Vwz3ArU4dOI8YvxtlhSZncwhK+XrSbz//aebhtS4MQb+4/vzGD29Wx5DnArr/gm0sBh+kPfuGL4B1StTHs/Rvmvgo75pzliSzQ4Ubo+xT4RVRIaIc5HDBmCOyce2TbkE+g/XUVex0REanWyvt+tI69m6g7grzdGNA6HIBxf8cfu4OLOwz9wnyTDzDnZZjyEJSWVF2QIiIiIlIhOnbsyPvvv8/+/ft57rnn+OKLL+jSpQvt27fnq6++oo7VzVS4/JWmlcumaPB09SLKN8rJEQlAcamd75bs4bw35/LmjC1k5BXTMMSbd65px8yHezO0Y3TdS6DnpcEvdwFl/+ZXfw8fdILlX4HdfubnXfujOc/Pt8Oa8ZCbcvz99q0wv3b+sp9JoFtdTPvQBr0huguEtYGgRuAXBZ6B4OYLbj6m0tzF0/Q6t7qapfGFcM8CuOzDik+ggykgu/htsLmZ+/1fUQJdREROSO1carHrusbw25r9TF69n6cuboG3+7/+57Zaof9LEFAfpv4HVnwNWYlw5VcV8xM5EREREakSxcXFTJw4kdGjRzNz5ky6d+/O7bffzr59+3jyySeZNWsWY8eOdXaYNdahoaKboy00CWyC1VLHErPVjMPhYMaGJN6YvoWdKbkAxAZ78XC/plzaLhKbtY7+utbhgN8egOz9ENwYBv0P/ngKktbBlIdh1XdmW2T70zvvvhXw63AoLYLU7bD+Z8ACkR2gSX9ocqG5P+812PaHOcZiMwnp3v+BwLiKfZ4VKaQx3DYd8tKhST9nRyMiItWYkui1WI+GwcQFe7E7NY8pa/dzTZcTDJvqeif4RsCE22HbDFM5cOs0k2QXERERkWpr5cqVjB49mnHjxmG1Whk2bBjvvPMOzZs3P7zP5ZdfTpcuXZwYZc3mKC0lf9UqwPRD7xzQxMkR1W1/705j1NRNrIzPAMwvcB+8oAnXda2Pm0sd//yy8lvY9Jup4r7iC5PkvnMuLP/S/PI4YQV83he63GHaeXr4n/KU5KbCj8NMAr1JfwhrDdtnmsT8/pVmmffakf0tNjNvq/djENSw0p5qhYrq5OwIRESkBlASvRazWCxc27U+r03bzLhle0+cRAdocQncPAW+vQz2LoG9SyG2R9UFKyIiIiKnrUuXLlx44YV8/PHHDBkyBFdX12P2adCgAddeqyHyZ6pw61bsubkUetiIrwfXBzZ1dkh10t60PF6aspE/NiYD4Olq445zG3BX74b4ehz7d1/nHNwK058w6xc8YxLoADYX6HY3tLwM/nga1v0Eyz6D7bPgxgknT3TbS2HCbZC1z7RgueILk3jv9xxkJ5lzbPsDdsyFomxoe42pPA9uVOlPV0REpKopiV7LXdExmrdmbGH13gw2JWbRIuIkA5tiukDLwWYq+fqflUQXERERqeZ27txJbGzsSffx9vZm9OjRVRRR7XOolcvOGFcc1hKaBKoSvSoVl9oZvXAX78zcRn5xKVYLXNOlPg/3a0Kon4ezw6seSgrNr4qL86DBedDj/mP38Q03SfAON8GvIyBtJ3zZH67/EaJOMID4z1fM0E1XL7jmu6Mr133DzcDPDjdCabFZ3Lwq5emJiIhUB3X89261Xz1fd/q3CgPgh2XHGTD6b62vNLcbJmnIqIiIiEg1d+DAAZYuXXrM9qVLl7J8+XInRFT75K0wr+PqiCIAmqoSvcqsik9n8IcLeXXqZvKLS+naIIgZD/Vm1NA2SqD/0+wXIWkteAbB5Z+evC1nw/PgjpkQ3gZyD8LXl8C2mcfut/l3+Ottsz74AwhreeJz2lyVQBcRkVpPSfQ64NqyNi6/rEogv6j05Ds3PM+8+cpLgd3zqyA6ERERETlTw4cPZ+/evcdsT0hIYPjw4U6IqHZxOBzkHxoqGmMhzCsMf/dy9JGWs5JVUMyzv65n6MeL2JSYRYCXK29c2Zbxd3WnSZivs8OrfKUlsGcxzHoe/q8nvBYL42+CNeMhP/3ofXfMgcUfmvXLPgK/iFOf3zccbpkKDftCcS6MvQZWfX/k8dQdMPEes97tHmhzZYU8LRERkZpMSfQ64JzGIUQHepJdUMLUdYkn39nmCq2GmPV1Eyo9NhERERE5cxs3bqRjx2NbMXTo0IGNGzee9vk++ugj4uLi8PDwoFu3bixbtuyk+2dkZDB8+HAiIiJwd3enadOmTJ069bSvW10VJyRQcuAAdhcbOyJQK5dKZrc7+G3Nfvq9PY9vF+/B4YChHaOY/ch5XN05BovF4uwQK09uqkmS/3wbvNkIRg+EBe/AgQ1QkAGbJsPEu+CNRvDNpbD0U0hccyTZ3fl2aH5x+a/n4WdaubS9Bhyl8Ot9MO9NKMqF8TdCYRbEdIcLX6qUpysiIlLTqCd6HWC1Wri2Swxv/bGVccviuaJT9MkPaH0FLP/KTHa/5H/g4l41gYqIiIjIaXF3dyc5OZmGDY8eDpiYmIiLy+m91R8/fjyPPPIIn3zyCd26dePdd99lwIABbNmyhdDQ0GP2Lyoq4sILLyQ0NJSff/6ZqKgo9uzZQ0BAwNk8pWolf8UKANJjAylyzVArl0ricDiYtekA78zcysbELAAahHjzypDW9Gwc4uToqsCKb2DKwyaZfYhHADTuB00HQGCcGeC5eapJqu+ab5ZDQppB/5dP/7oubqb9i1+kSdj/+TKs+hYy4sE7FK762uwjIiIiSqLXFVd1juGdWdtYviedbcnZJ/8ZZP0e4BsB2YmwffbpVTSIiIiISJXp378/I0eO5Ndff8Xf37QZycjI4Mknn+TCCy88rXP973//48477+TWW28F4JNPPuH333/nq6++4oknnjhm/6+++oq0tDQWLVqEq6srAHFxcWf3hKqZQ0NFt9c3H5tUiV6xHA4H87Ye5J2ZW1mzLxMAH3cX7jy3IXef1xAPV5uTI6wCKdtg2n9NAj20lUmaNx0AUZ3B9o+P6zFd4fynzUDQzVNhy1SIXwwuHnDll2fek9xigX7Pg2+kiSMjHiw2k0AvT2sYERGROkJJ9DoizM+D85uHMnNjMuOW7eXZS08yGMZqg1ZDYclHsP5nJdFFREREqqm33nqL3r17ExsbS4cOHQBYvXo1YWFhjBkzptznKSoqYsWKFYwcOfLwNqvVSr9+/Vi8ePFxj5k8eTI9evRg+PDh/Prrr9SrV4/rr7+exx9/HJutdiQ/81aaSvSlodmAhopWpEXbU3h75lZW7DE9vj1dbdzSK467zm1IoHcdqX62l8Kk+6CkABqdDzf+YpLaJxPUEHqOMEtemjmHT72zj6XbXSZp/uco6H4vxPU6+3OKiIjUIkqi1yHXd63PzI3J/LJqH/8d2OzklR2trzBJ9C3TTF88N++qC1REREREyiUqKoq1a9fy/fffs2bNGjw9Pbn11lu57rrrDleHl0dKSgqlpaWEhYUdtT0sLIzNmzcf95idO3cyZ84cbrjhBqZOncr27du57777KC4u5rnnnjvuMYWFhRQWFh6+n5WVVe4Yq1pJejpF23cAsCa8ABeLKw38Gjg5qpqvoLiUh35YzfQNSQC4u1i5qXss9/RpRIhPHWsjueT/YN8ycPOFS98/dQL937yCKjaeFpeaRURERI6hJHod0rtpPSL9PdifWcCMDUlc1j7qxDtHdTS999J3m0S6JrKLiIiIVEve3t7cddddVX5du91OaGgon332GTabjU6dOpGQkMCbb755wiT6qFGjeOGFF6o40jOTv2oVACX1w8n2SqFJQANcbeX/YkKOlV9Uyp3fLmfB9hTcbFau6xrDfX0bE+bn4ezQql7KNphT1sd8wMsQEOPceEREROSklESvQ2xWC1d3ieHdWdsYtyz+5El0i8VUo//1Nqz/RUl0ERERkWps48aNxMfHU1RUdNT2wYMHl+v4kJAQbDYbycnJR21PTk4mPDz8uMdERETg6up6VOuWFi1akJSURFFREW5ux7bkGDlyJI888sjh+1lZWcTEVM/kYV7ZUNGUJvWAFJoEqB/62cgtLOG2r/9m6a40vNxsfHVLF7o3DHZ2WM7x7zYuHW92dkQiIiJyCkqi1zFXd47h/dnbWLIzjc1JWTQP9zvxzoeS6NtnQn4GeAZUVZgiIiIiUg47d+7k8ssvZ926dVgsFhwOBwCWsrYQpaWl5TqPm5sbnTp1Yvbs2QwZMgQwleazZ89mxIgRxz2mV69ejB07FrvdjtVqBWDr1q1EREQcN4EO4O7ujrt7zWjZkV82VHRrjPmSQP3Qz1xWQTG3jv6bFXvS8XV34evbutAptoJbkdQkZ9vGRURERKqc9UwO2rt3L/v27Tt8f9myZTz00EN89tlnFRaYVI7IAE8uamOmrL/y+6bDH7SOK6wV1GsBpUWweUoVRSgiIiIi5fXggw/SoEEDDhw4gJeXFxs2bGD+/Pl07tyZuXPnnta5HnnkET7//HO++eYbNm3axL333ktubi633norAMOGDTtq8Oi9995LWloaDz74IFu3buX333/n1VdfZfjw4RX5FJ3CXlBA/oYNACyplwkoiX6mMvOKuemLpazYk46fhwvf3dGtbifQj2rj8orauIiIiNQQZ5REv/766/nzzz8BSEpK4sILL2TZsmU89dRTvPjiixUaoFS8/w5ohpvNyl/bUpi79eDJd259hbldP6HyAxMRERGR07J48WJefPFFQkJCsFqtWK1WzjnnHEaNGsUDDzxwWue65ppreOutt3j22Wdp3749q1evZvr06YeHjcbHx5OYmHh4/5iYGGbMmMHff/9N27ZteeCBB3jwwQd54oknKvQ5OkPBunVQXIwttB6rXBIAaBKodi6nKy23iOs+X8KafZkEerky7q7utIsJcHZYznNMG5dhzo5IREREyumM2rmsX7+erl27AvDjjz/SunVrFi5cyB9//ME999zDs88+W6FBSsWKDfbmll5xfDZ/J6/8volzGofgajvB9ymth8KfL8POeZBzEHzqVW2wIiIiInJCpaWl+Pr6Aqav+f79+2nWrBmxsbFs2bLltM83YsSIE7ZvOV5le48ePViyZMlpX6e6O9QPvbRNU0pZip+bH2FeYU6OqmY5mF3IjV8sZUtyNiE+bnx/R3eahfs6O6yzd3ALLP0EinIhphvE9oSQZmAtR32a2riIiIjUWGeURC8uLj7cy3DWrFmHBxY1b978qOoUqb5GnN+Yn1fsY/uBHH5YFs9NPeKOv2NwI4jsAPtXwcZJ0PXOqgxTRERERE6idevWrFmzhgYNGtCtWzfeeOMN3Nzc+Oyzz2jYsKGzw6ux8sr6oR9sHAKYKnSLEp7l9seGJJ6cuJ6UnEJCfd0Ze2d3Gof6VO5F89LAxQPcvCrn/EnrYP5bsPFXoKwl5trx5tYzEGK6Q2wPc+viDjkHICe5bClb3zrd7K82LiIiIjXOGSXRW7VqxSeffMKgQYOYOXMmL730EgD79+8nOLiOTlivYfw8XHn4wqY8M2k9/5u5lcHto/D3dD3+zq2vMEn09b8oiS4iIiJSjTz99NPk5uYC8OKLL3LJJZdw7rnnEhwczPjx450cXc3kKC0lf9UqALbEWCBX/dDLKyOviBd+28jEVaYFTuNQH74Y1pm4EO/Ku2hJEfzxNCz7FCxWCG4C4a0hvE3Z0hZ8Qs/8/PtWwPw3Yeu0I9uaX2LmR8Uvhn3LIT/dPP7PfU6k8YVq4yIiIlIDnVES/fXXX+fyyy/nzTff5Oabb6Zdu3YATJ48+XCbl/IYNWoUv/zyC5s3b8bT05OePXvy+uuv06xZs5Me99NPP/HMM8+we/dumjRpwuuvv87FF198Jk+lTruuSwzfLtrNtgM5fDhnG08Nann8HVsNNW9M4xdBZgL4R1VtoCIiIiJyXAMGDDi83rhxYzZv3kxaWhqBgYGqnD5Dhdu2Yc/JwertzUqfNMhVP/TymL0pmZG/rONAdiFWC9zVuxEP9WuCh6ut8i6asRd+ugUSlpv7DjukbDHLP2c6eQaB1QUcpaYvub30yLrFCl5B4BUM3iHgFVK2Hgx7FsGOOWUnsZhWl+c+BmH/+NxUWgyJa81npfglsHeZOadPKPiElS2hZvGLgmYXqY2LiIhIDXRGSfQ+ffqQkpJCVlYWgYGBh7ffddddeHmV/+dz8+bNY/jw4XTp0oWSkhKefPJJ+vfvz8aNG/H2Pn61wqJFi7juuusYNWoUl1xyCWPHjmXIkCGsXLmS1q1bn8nTqbNcbFaeGtSCW0b/zdeLdnNj91hig4/zuvtHQf2e5o3hkv+D+j3+8bPEJHObnwE9hkOLS6r8eYiIiIjURcXFxXh6erJ69eqj3gcHBQU5Maqa71A/dM/27dmStQ1QJfrJZOYX8+JvG5mwch8ADet589ZV7ehYP/AUR56lbbPglztMFbhHAAz9DCLam7YrSWvLbtdB6nbITzv5ubISzHI8Fhu0uxbOeRhCjvNlis0VojuZpef9Z/usREREpJqyOBwOx+kelJ+fj8PhOJww37NnDxMnTqRFixZHVcOcroMHDxIaGsq8efPo3bv3cfe55ppryM3NZcqUKYe3de/enfbt2/PJJ5+c8hpZWVn4+/uTmZmJn5/fGcdamwz7ahnztx5kYKtwPrmp0/F3WvY5TH3s5CfyCYMH14KrR8UHKSIiIlJLVOT70YYNGzJx4sTDvwytaarje/OEx/5D1pQp+Nx3Jxf7jwZg6fVL8XKtpF7bNdjC7Sk8+uMakrIKsFjgjnMa8Gj/ZpVbfW4vhbmvmRYrOMz8pqu+gcDY4+9flAtpu8y61WaS4lbbkXV7iUmy56ZCXgrkpUJuiln3CDDtLAPjKu/5iIiIiFOV9/3oGVWiX3bZZQwdOpR77rmHjIwMunXrhqurKykpKfzvf//j3nvvPaOgMzMzgZNXzyxevJhHHnnkqG0DBgxg0qRJZ3RNgacHtWDgtoNM35DE0p2pdGt4nL72ba6C1WPNG0rff/4ssWx9/luQtQ/WjIXOt1X9kxARERGpg5566imefPJJxowZowr0ClK0yyRcD0R6QS5E+0Qrgf4vpXYHH87Zzruzt+JwQIMQb968si2d4yr5bzDnIEy4HXbNM/e73AEDXjWDPE/Ezdv0SD+pBhUWooiIiNROZ5REX7lyJe+88w4AP//8M2FhYaxatYoJEybw7LPPnlES3W6389BDD9GrV6+TtmVJSkoiLCzsqG1hYWEkJSUdd//CwkIKCwsP38/Kyjrt2Gq7pmG+XNe1Pt8vjefl3zfx6/BeWK3/6tPnGQB3/Xnik5QUwvTHYeF70GEY2M7oT0tERERETsOHH37I9u3biYyMJDY29piWiCtXrnRSZDVX0T7TlmSXd56Gih5HSk4hD49fzV/bUgC4pnMMzw9uhadbJVafA6Rsh28uhez94OoNl74Hba+q3GuKiIiIlDmjTGdeXh6+vr4A/PHHHwwdOhSr1Ur37t3Zs2fPGQUyfPhw1q9fz4IFC87o+BMZNWoUL7zwQoWeszZ6+MKmTF69n3UJmUxclcAVnaJP7wQdh8H8NyB9N2ycBG2urIwwRUREROQfhgwZ4uwQapXS7GzsZb+O3eRuksQaKnrEsl1p3D9uJclZhXi4Wnl5SBuuPN3PDWciYy98e5lJoIc0havHQGjzyr+uiIiISJkzSqI3btyYSZMmcfnllzNjxgwefvhhAA4cOHBGvQxHjBjBlClTmD9/PtHRJ38TFh4eTnJy8lHbkpOTCQ8PP+7+I0eOPKr9S1ZWFjExMacdY20X4uPO8PMb89q0zbwxYzMDWofj434afx5uXtDtHvjzFVjwDrS+QlPnRURERCrZc8895+wQapXisip0W1AQG/NMWxdVooPd7uCzv3by5owtlNodNKrnzf/d0Ilm4b6Vf/GcgzBmiGkdGdIUbp0G3iGVf10RERGRf7CeyUHPPvssjz32GHFxcXTt2pUePXoApiq9Q4cO5T6Pw+FgxIgRTJw4kTlz5tCgwal70fXo0YPZs2cftW3mzJmHY/g3d3d3/Pz8jlrk+G7tFUdssBfJWYW8M3Pr6Z+g653g5gPJ62HbzIoPUERERESkEh1q5eIaFcWOzB2AKtGzC4q5a8xyXpu2mVK7g8vaRzJ5xDlVk0AvyITvhkLqdvCPgZsmKoEuIiIiTnFGSfQrr7yS+Ph4li9fzowZMw5vv+CCCw73Si+P4cOH89133zF27Fh8fX1JSkoiKSmJ/Pz8w/sMGzaMkSNHHr7/4IMPMn36dN5++202b97M888/z/LlyxkxYsSZPBX5B3cXGy9eZvrRj164i/UJmad3As9A6HyrWV/wvwqOTkRERET+zWq1YrPZTrjI6Snel2Buw4PIL8nH3eZOfd/6To7KeQqKS7nr2xXM2nQANxcrr17ehnevaY/36fxi9UwV5cHYayBpLXjXg2G/gn8VtI4REREROY4zfvcTHh5OeHg4+8qqNaKjo+natetpnePjjz8GoE+fPkdtHz16NLfccgsA8fHxWK1Hcv09e/Zk7NixPP300zz55JM0adKESZMmnXQYqZTfeU3rcUnbCKasTeSpSev55d6e2P49ZPRkug+HpZ9C/GLYsxhij/8LARERERE5exMnTjzqfnFxMatWreKbb77RXKAzULx3LwAZQW4ANApohM1aN7+MKLU7eOTH1SzemYq3m43v7uhGh/qBVXPxkiL4cZj5TOHubyrQgxtVzbVFREREjuOMkuh2u52XX36Zt99+m5ycHAB8fX159NFHeeqpp45Kep+Mw+E45T5z5849ZttVV13FVVdpEntleeaSlszbcpA1ezMYuyyem7rHlv9gvwhodx2s/MZUo8f+VHmBioiIiNRxl1122THbrrzySlq1asX48eO5/fbbnRBVzVWUYAqEEnxLgLrbD93hcPDc5PVMXZeEm83KZ8M6V2wCPSsRDm4C71DwjQCvoCPzlOylMPEu2D4TXDzhhh8hvE3FXVtERETkDJxREv2pp57iyy+/5LXXXqNXr14ALFiwgOeff56CggJeeeWVCg1SqlaYnwePDWjGc5M38Mb0zQxoFUaor0f5T9DrQVg1Brb9AUnr9KZXREREpIp1796du+66y9lh1DiH2rls98oG6m4S/b3Z2/huSTwWC7xzTXt6Na6gPuSlxbDoA5j3OpQUHNludQXfcPAJAxyQsMJsu/Y7qN+9Yq4tIiIichbOqCf6N998wxdffMG9995L27Ztadu2Lffddx+ff/45X3/9dQWHKM5wY/dY2kb7k11Qwiu/bzq9g4MbQcshZn1B+Xvki4iIiMjZy8/P5/333ycqKsrZodQoDoeD4rJWletck4G6OVT0uyV7eHfWNgBeHNyKQW0jKubEe/+GT8+D2S+YBHpAffAqS87biyFzLyQsNwl0ixWu+Bwa96uYa4uIiIicpTOqRE9LS6N58+bHbG/evDlpaWlnHZQ4n81q4ZUhbbjsowX8uno/V3aK5twm9cp/gnMehg2/wIaJcP7TENSw8oIVERERqaMCAwOxWI7Mr3E4HGRnZ+Pl5cV3333nxMhqnpKDB3EUFoLVyjpbIlD3KtGnrkvkmV/XA/DABU24qUfc2Z+0IBNmvwh/fwk4wDMIBrwK7a41LVxKiiD3AGQnQ3Yi5CRBZEeI6nj21xYRERGpIGeURG/Xrh0ffvgh77///lHbP/zwQ9q2bVshgYnztYn2Z1iPOL5etJtnJq1n+kO98XAt52CliLamcmT7LFj4Plz6bqXGKiIiIlIXvfPOO0cl0a1WK/Xq1aNbt24EBlbREMha4lArF0e9IEpsGQR7BBPkEeTkqKrOoh0pPPTDahwOuL5bfR7ud5ZV+A4HbJoMU/9rEuMA7a6H/i+Dd/CR/VzcwD/aLCIiIiLV1Bkl0d944w0GDRrErFmz6NGjBwCLFy9m7969TJ06tUIDFOd6tH9Tpq5LZHdqHh/P3cHDF55GNc45j5gk+urvoc8Tps+hiIiIiFSYW265xdkh1BrFZUNF80J9gYw6VYW+aEcKd327gqJSOxe1Duely1of9eXMacs5AFMehs1TzP2gRqaopkHvColXREREpKqdUU/08847j61bt3L55ZeTkZFBRkYGQ4cOZcOGDYwZM6aiYxQn8vVw5blLWwHw8dwd7DyYU/6DY3tCTDcoLYI/NWxWREREpKKNHj2an3766ZjtP/30E998840TIqq5DvVDTwkwv7ysK/3QJ67ax81fLSOnsISejYJ555r22KxnkUDfMAn+r7tJoFtdofd/4d5FSqCLiIhIjXZGSXSAyMhIXnnlFSZMmMCECRN4+eWXSU9P58svv6zI+KQauLhNOH2a1aOo1M6TE9dhtzvKd6DFAhc8a9ZXfmuq0kVERESkwowaNYqQkJBjtoeGhvLqq686IaKaq2ivSaLv9ysBoFFAI2eGU+kcDgcfzN7Gw+PXUFzq4JK2EXx1S5fyt2/8t7w0+Pk2+OlmyEuFsDZw159w/lPg6lGxwYuIiIhUsTNOokvdYbFYeHFwazxdbSzZmcbnf+0s/8Fx50DXu836r/dDfkalxCgiIiJSF8XHx9OgQYNjtsfGxhIfH++EiGquQ5XoCb4miV7Ps54zw6lUxaV2npiwjrdnbgXg7vMa8v61Hc48gb5luqk+Xz8BLDbo/R+4cw6Et6nAqEVEREScR0l0KZf6wV48d2lLAN76YwvrEzLLf3C/5yCoIWTvh+kjKylCERERkbonNDSUtWvXHrN9zZo1BAcHH+cIOZFDSfTdPnkABHvWztcvu6CY279Zzvjle7Fa4KUhrRl5UQusZ9LCJT8dJg2HcddATjKENIU7ZsL5T5uBoSIiIiK1hJLoUm7XdIlhQKswiksdPPDDKvKLSst3oJs3DPkYsMCasbBZw2dFREREKsJ1113HAw88wJ9//klpaSmlpaXMmTOHBx98kGuvvdbZ4dUYjuJiipOSANjhZWYABXvUviR6UmYBV32ymPlbD+LpauPzYZ25qXvs6Z+otASWfQ7vd4TV3wEW6DEC7p4PUZ0qPG4RERERZ3M5nZ2HDh160sczMjLOJhap5iwWC68NbcvqvfPZeTCXl37fyKuXl/MnmvW7Q4/hsPhDmPKQue8VVKnxioiIiNR2L730Ert37+aCCy7AxcW8tbfb7QwbNkw90U9DcWIi2O3g7kaqVylgIcizdr1XPZBdwBUfLyIhI58QH3e+uqUzbaMDTv9EO/6EGU/CgY3mfkgzuPRdiO1ZkeGKiIiIVCunlUT39/c/5ePDhg07q4Ckegv0duN/V7fnhi+WMnZpPH2a1qN/q/DyHXz+07DtD0jZClP/A1dqCK2IiIjI2XBzc2P8+PG8/PLLrF69Gk9PT9q0aUNs7BlUF9dhh1q5EB4KliQC3ANwtbo6N6gKVFBcyt1jVpCQkU9csBdjbu9GTJDX6Z0kdQfMeAq2TjP3PQOh71PQ6VawndbHShEREZEa57Te7YwePbqy4pAapFfjEO7q3ZDP5u/k8QlraR8TQKifx6kPdPWEIZ/Al/1g/c/QcjC0vKzyAxYRERGp5Zo0aUKTJk2cHUaNVVSWRC8ODwSSalUrF4fDwchf1rEqPgN/T1dG39r12AR65j74+hLISwOvQPAMMr8a9QwCr2AozoPVY8FeDFYX6HInnPdf/bJURERE6gz1RJcz8mj/prSK9CM9r5hHf1qD3e4o34HRneCch836lIch52DlBSkiIiJSy11xxRW8/vrrx2x/4403uOqqq5wQUc1UvC8BgLx6vkDtGir6ybydTFyVgM1q4f9u6EiDEO+jd3A44PdHIX0XFGZC+m7YvxK2z4J1P8LSj2HlNyaB3qQ/3LsYLnpNCXQRERGpU/S7Ozkj7i423ru2PZd8sIC/tqXw1cJd3HFuw/IdfN7jsGU6HNhg+qMPeNW8CXfzAYulUuMWERERqU3mz5/P888/f8z2iy66iLfffrvqA6qhDrVzyQx2B2rPUNGZG5N5Y8ZmAJ6/tCW9Goccu9PGSbB1Olhd4YafzK9H89IgP+3IbWEONBsIjftV7RMQERERqSaURJcz1jjUl6cHteTpSet5Y/oWejQKplXkyfvmA+DiDpd/Ap/3hc1TzALmjfuhn416BkJgLDS7yLxZd/M++TlFRERE6qCcnBzc3NyO2e7q6kpWVpYTIqqZDrVzSQm0AbWjEn1zUhYP/bAKhwNu6h7LTT3ijt0pPx2m/tesn/soNOpbpTGKiIiI1BRq5yJn5YZu9enXIoyiUjsjxq4iM7+4fAdGtIVL3we/aLCVffCzF0NOMhzcBPGLYM04+HEYvNEQfrgB1vxg3uiLiIiICABt2rRh/Pjxx2z/4YcfaNmypRMiqpkOVaIn+tmBmp9ET80p5Pavl5NbVErPRsE8e+kJ/hZmPge5ByCkKZz7SNUGKSIiIlKDqBJdzorFYuGNK9ty6QcL2JWSy6M/ruazmzpjtZajLUuHG8zicJhhRf/+2WjCStj0G2TsOVKxbnWBBr2h+SBoMgACYir/SYqIiIhUU8888wxDhw5lx44dnH/++QDMnj2bsWPH8vPPPzs5uprBnptLaVoaAPG+hZBWs9u5FJXYuee7FSRk5BMX7MX/3dARV9txaqd2LzC9zgEufc/8WlREREREjktJdDlrQd5ufHxjR678ZDGzNh3ggznbebBfk/KfwGIx7VrcvI9Oire+Avq/DEnrTAJ9029wYCPsmGMWHoV6LaBpfzPkKKYb2Fwr/PmJiIiIVFeXXnopkyZN4tVXX+Xnn3/G09OTdu3aMWfOHIKCNPixPIoSzFBRq78/SZgWODW1Et3hcPDMpPX8vTsdXw8Xvri5CwFex7b7obgAfnvQrHe6BWJ7VmmcIiIiIjWNkuhSIdpGB/DykNb89+e1vDt7K22i/Ti/edjZn9hiMa1fItpC3ychZTts/g22zoC9S03rl4ObYOF74O4Pjc+HHiMguvPZX1tERESkBhg0aBCDBg0CICsri3HjxvHYY4+xYsUKSktLnRxd9XeolYtbVBSp+alAzU2ij1myh/HL92K1wAfXdaBxqM/xd/zrbUjdDj7h0O+Fqg1SREREpAZST3SpMFd3juHG7vVxOODBH1azOyW34i8S0hjOeRhumw7/2QFXfAltrzHDSAszYcNE+PYySNtV8dcWERERqabmz5/PzTffTGRkJG+//Tbnn38+S5YscXZYNcKhJLpLdBSpBWVJ9BrYzmXJzlRe/G0jACMvakGfZqHH3/HAJljwjlm/+A3wDKiaAEVERERqMCXRpUI9e0krOtYPILughLvHrCCvqKTyLuYVBG2uhKGfwX+2w+2zILoLFOXAxHugtBKvLSIiIuJkSUlJvPbaazRp0oSrrroKPz8/CgsLmTRpEq+99hpdunRxdog1QlFZEt0REUqpw1Tu17QkekJGPsO/X0mJ3cFl7SO549wGx9/RbofJD4C9GJpdDC0GV22gIiIiIjWUkuhSodxcrHx8YydCfNzZkpzNf39ei8PhqPwLW20Q08VUprv5wt4lsPCdyr+uiIiIiBNceumlNGvWjLVr1/Luu++yf/9+PvjgA2eHVSMV7zM90fND/QDwd/fHtQbN2ckvKuWub5eTmltEq0g/XhvaFovFcvydl38J+5aBmw9c/JZpnSgiIiIip6QkulS4MD8PPr6xIy5WC1PWJvLlgipsrRIYC4PeMutzX4OEFVV3bREREZEqMm3aNG6//XZeeOEFBg0ahM1mc3ZINVbx3r0AZId4AjWrCt3hcDDyl7Vs2J9FsLcbnw3rjKfbCf4WclNgVln/8wueA/+oqgtUREREpIZTEl0qRZe4IJ65pCUAo6ZtZu6WA1V38bbXQMshYC+BX+6ColP0ZrfbITupSkITERERqQgLFiwgOzubTp060a1bNz788ENSUlKcHVaN43A4KEowlejpgab6vCYNFf1ywS4mrd6PzWrhoxs6EhXgeeKd//ofFGVDeFvocnvVBSkiIiJSCyiJLpVmWI9YhnaMotTu4K4xK/izqhLpFgtc8g74RkDqdvjj6RPve3ArjL4I3m4GSz+tmvhEREREzlL37t35/PPPSUxM5O677+aHH34gMjISu93OzJkzyc7OdnaINUJpejqOvDwAknztQM2pRP9r20FenboJgGcvaUn3hieJO3Mf/P2FWe/3nGmFKCIiIiLlpiS6VBqLxcJrQ9vSv2UYRSV27v52BTM3JlfNxb2CYMjHZn35V7Bl+tGPlxTBvDfhk16mfzrAn69AfnrVxCciIiJSAby9vbnttttYsGAB69at49FHH+W1114jNDSUwYM1NPJUisuGirqEhZFizwQgxDPEmSGVS3xqHiPGrsLugKs6RTOsR+zJD5j3BpQWQmwvaHRB1QQpIiIiUosoiS6Vys3Fykc3dGRQmwiKSu3c+90Kpq1LrJqLN+oL3Yeb9V+HQ05ZJfy+5fDZefDny1BaBE36Q73mUJAJC9+rmthEREREKlizZs1444032LdvH+PGjXN2ODXCoSS6a3Q0qfmpQPVv52K3O3ho/Coy84tpHxPAS0Nan3iQKEDKdlj1nVm/4FkNExURERE5A0qiS6VztVl579r2XNY+khK7gxHjVvHbmv1Vc/ELnoXQlpCXYhLp00fCF/3gwEbwCoYrvoTrf4R+z5v9l3wCWVWU5BcRERGpBDabjSFDhjB58mRnh1LtFe01SXS36ChSC8qS6NW8ncvEVQmsjM/Ay83G/93QEQ/XU7RmmfsqOEqhyQCo371qghQRERGpZZRElyrhYrPyv6vbH+6R/uAPq5i4al/lX9jVA4Z+DjY32PYHLPk/wAFtr4Xhf0ObK001TtOBEN0VSvJh/huVH5eIiIiION3hSvSomlGJnl1QzKhpmwG4//wmRJ5skChA4lpYP8GsX/BMJUcnIiIiUnspiS5Vxma18NaV7bi2Swx2Bzzy4xp+XL638i8c3hr6vWDW/evDDRNg6Kfg/Y8PSBbLkWr0ld9C6o7Kj0tEREREnKo4oSyJHhNTIyrRP5iznZScQhqEeHPbOXGnPmDOy+a29RUQ3qZSYxMRERGpzZRElypltVp49fI23Ni9Pg4H/Pfntfz4dxUk0nvcB/ctheFLoUm/4+8T1wsaXwj2Evjz1cqPSUREREScqmhfAgAuUZGk5acB1bcSffuBHL5asAuAZy9tibvLKdq4xC+BbTPAYoO+T1VBhCIiIiK1l5LoUuWsVgsvXdaaW3vFAfD4L2uZsKIKWruENgc3r5Pvc+hnrut/Nj9/FREREZFayVFaSvF+M6enMNSfEkcJAEEeQc4M67gcDgcv/LaBEruDC5qH0rdZ6KkOgFllv8TscCMEN6r8IEVERERqMSXRxSksFgvPXtKSYT1icTjgPz+v4dfVCc4OCyLamZ+7Asx5ybmxiIiIiEilKUlKgpIScHUl3dcCgJ+bH242NydHdqyZG5P5a1sKbjYrz1zS8tQH7JgN8YvA5g7nPV75AYqIiIjUckqii9NYLBaev7QV13Wtj90BD49fze9rE50dlvm5q8VmBpHuWeTsaERERESkEhxq5eIaGUFaUQZQPVu5FBSX8tLvGwG4s3cD4kK8T36A3Q6zXzTrXe8E/6hKjlBERESk9lMSXZzKarXwypDWXN05GrsDHvhhFdPXJzk3qOBG0HGYWZ/1gvk5rIiIiIjUKsX7TDtBt+jqPVT0s/k72ZuWT7ifB8P7Nj75znY7rB0PiWvAzQfOebhqghQRERGp5VycHYCI1Wph1NC2lJQ6+GVVAvePW8nHN3SiX8sw5wV13uOwZhzsXQJbZ0CzgeU/tqQI/nwZ7KXQ/T5V/4iIiIhUQ0X7zHB71+hoUvJTgOpXiZ6Qkc//zd0OwJODWuDl9o+PbxnxcGCTWQ5uNrcpW6E4zzzeYwR4hzghahEREZHaR0l0qRZsVgtvXtWOYruD39bs577vV/LpsE6nHppUWfwioNvdsPA983PYJv3BWo4fbhTlwvgbYcccc3/ZZ9DhJlMFFBBTObFunAzbZ0K9FhDTFcLbgkv16+UpIiIiUp0UH2rnEh1Far6pRA/xrF5J51d/30RBsZ1uDYK4tG3EkQf+eBoWfXD8g2xu0Lgf9BxRNUGKiIiI1AFKoku1YbNaeOfqdpTa7Uxdl8Td367gravbMbhdpHMC6vUQLP8aDmyAH2+CwR+AV9CJ989Ph++vhn3LwNULwtvA3qWw/EtY+S10uBHOfQQC6ldMfMUFMP0JWDH66O02d4hsbxLq0V0h7pyTxy0iIiJSBx1p5xJNaoGZg1Od2rks2p7C7+sSsVrg+cGtsFjM8FOy9sOST8x6vRYQWrbUa25uAxuATR/zRERERCqS3l1JteJis/LetR1wOFYxbX0SD4xbRXxqLsP7Nj7ywaGqeAXBoLdh0r2weQokrIShn0KD3sfum50EY4aahLtHANzwM8R0gd0LYO5rsPsvk+xeNQbaXw+NzgeL9egFi/nAE90FPPxPHlvaTvjxZkhaa45rfwPkpcDeZZCfZpL3e5eWPY9guHMOBMZV7OsjIiIiUoMdSqK7RseQmlzWE72atHPJKyrhiV/WAXBj91haRPgdeXDJ/4G9GOr3hNumOSlCERERkbpFSXSpdlxtVj68viOjpm7iiwW7eOuPrexKyWPU0Da4uVTxLNy2V0G9pvDz7ZC6Db4ZbKrJ+4wEm6vZJ20XjBkC6bvBJxxumghhLc1jcefALVNgzyKTTN81z1Slr/z2xNd09YI2V0Ln201F+b9t+g0mDYfCTJMgH/qZ+ckumCGoaTtNMn3fMtg2EzL3wh/PwDVjKvCFEREREam57AUFlBw8CJS1c9lTvQaLvj5tM/FpeUQFePKfAc2OPJCfDsvLfoWooaEiIiIiVUZJdKmWbFYLT1/SktgQb577dT0TVu4jISOPT2/sjL+Xa9UGE9EO7p4H0x43leR/vQ0758EVX0BxPoy5HHKSTKX3TZMgqMGx54jtCTdPhvglsORjyD0IDnvZ4jiynpcKGXuOJNqjOplkeqvLTdJ+1vOw+ENzzphucOXooweXWiwQ3Mgs7a+D5A3wyTmwabKpio87pwpeMBEREZHqrTjB9EO3entjCwg43BO9OlSiL96RyjeL9wDw2hVt8PX4x3vfv7+AohwIbQVNLnRShCIiIiJ1j1OT6PPnz+fNN99kxYoVJCYmMnHiRIYMGXLC/efOnUvfvn2P2Z6YmEh4eHglRirOclP3WKIDPRnx/UqW7Ezj8o8XMvqWLsQGe1dtIG7ecNmH0PgCmPwgJCyHT84Fqw0KMiC0palA9z3F32H97mY5EYfDVK0v/9IMDE1YYZYZI8EvCg5sNPv1GAH9nj9SDX8iYa2g063mfNOeMF8GWG2n88xFREREap0jrVyiAUgtqB6V6LmFJfzn5zUAXN+tPuc2qXfkwaK8I73Qz3nYFE+IiIiISJWo4t4YR8vNzaVdu3Z89NFHp3Xcli1bSExMPLyEhoZWUoRSHfRtFsrP9/Yk0t+DnQdzufz/FrF8d5pzgml1Ody7AGK6Q1G2SaBHd4Fbfj91Ar08LBaI6wVXfgWPbIILnjODSAsyTQLd3R+uHQsDXjl1Av2Qvk+ZHuvJ60wlvYiIiEgdV3QoiR4TTVZRFiX2EsD5leivTdvMvvR8ogI8efLiFkc/uPp7MwMnoL55TyoiIiIiVcaplegXXXQRF1100WkfFxoaSkBAQMUHJNVWiwg/Jg3vxe3fLGddQibXfb6EZy9pyY3dY6t+4GhAfZM0X/oJZCXA+U+bSvWK5lPP9F/v9SBsnw17FkKnW47fLuZkvIPhvCdMNfvsl8yHrlMNLhURERGpxYr3mXYublHRh1u5+Lr54mZzc1pMi7anMGaJaePyxpVt8XH/x0e10mJY+L5Z7/mAGUYvIiIiIlXGqZXoZ6p9+/ZERERw4YUXsnDhQmeHI1Uk1M+D8Xd3Z2CrcIpLHTzz6wYeHr+avKKSqg/G5gI9R8DAUZWTQP8nqw2a9ocLXzj9BPohXe+E4Camemn+mxUb39nas9i0rhERERGpIr79LqDeww/j07dPtWjlklNYwn9+XgvAjd3r06txyNE7bJgImfHgFQIdbnRChCIiIiJ1W41KokdERPDJJ58wYcIEJkyYQExMDH369GHlypUnPKawsJCsrKyjFqm5vNxc+PjGjjx1cQtsVguTVu9nyEcL2XEwx9mhVW82Vxjwqllf8gmk7nBuPIek7YRvL4Mfb4L4pc6ORkREROoIr06dCLn7Lry7d68WQ0VfnbqJhIx8ogM9GXnRv9q4OByw4B2z3v1ecPWs+gBFRERE6rgalURv1qwZd999N506daJnz5589dVX9OzZk3feeeeEx4waNQp/f//DS0xMTBVGLJXBYrFwZ++GjL2jG/V83dmanMPgDxYwdV2is0Or3pr2h8b9wF4Mfzzt7GjMB8Jpj0Npobm/+APnxiMiIiJ1Ukp+CuC8SvS/th1k7NJ4wLRx8Xb/V6uWbX+Y2ThuvtDlDidEKCIiIiI1Kol+PF27dmX79u0nfHzkyJFkZmYeXvbu3VuF0Ull6tYwmN8fOIduDYLILSrlvu9X8uJvGykutTs7tOprwKtgscGWqbDjT+fGsnmK+VBoLRuQummKqUwXERERqUKH2rmEeIacYs+Kl11QzONlbVyG9YilZ6PjxHCoCr3zreAZUHXBiYiIiMhhNT6Jvnr1aiIiIk74uLu7O35+fkctUnuE+nrw/R3duOe8RgB8tXAX1362hKTMAidHVk3Va2b6owNMHwmlp9FPvigP9i6D1eMgL+3s4ijMgWlPmPVzHjIV8jhMqxkRERGRKuTMdi7fLt7D/swCYoI8eXxg82N32LMY4heDzQ2631fl8YmIiIiI4dSx7jk5OUdVke/atYvVq1cTFBRE/fr1GTlyJAkJCXz77bcAvPvuuzRo0IBWrVpRUFDAF198wZw5c/jjjz+c9RSkGnCxWXniouZ0rB/Aoz+tYcWedC754C/ev67D8at56rrzHoe14+HgJpj3OjTpDy7u/1g8THV42g7Yvwr2r4bE1XBwMzjKqvwbnQ83TTzzGOa/AVn7IKA+nPMI7F0K22fBqu+g70jwDKyIZyoiIiJySs4aLFpSaue7JXsAeOiCpse2cQFY+K65bXct+J24cEhEREREKpdTk+jLly+nb9++h+8/8sgjANx88818/fXXJCYmEh8ff/jxoqIiHn30URISEvDy8qJt27bMmjXrqHNI3dW/VTi/hflyz3cr2JyUzY1fLOU/A5pzz3kNsVgszg6v+vAKgr5PwdTHTDJ7/hvlP9YnDPJSYccc2DkPGp53+tc/sBkWf2TWL3oT3LygYR8Iaw3J62H5aDj3kdM/r4iIiMgZcFYl+syNySRmFhDk7cagtsdJkCeth63TAQv0fLBKYxMRERGRo1kcDofD2UFUpaysLPz9/cnMzFRrl1oqv6iUpyat45eVCQD0bxnGW1e3w8/D1cmRVSOlJfDrfabKvKQASgrNgM+SQijOBxwmYR7RHiLbH7n1jTDDQJd9CpEd4c45cDpfUDgc8PUlsGcBNLsYrht35LHV42DSPeYaD64FF7eKfMYiIiLVht6PHlEdXosLf76QpNwkxl48ljb12lTZda/9bDFLdqYxvG8j/jPgX61c9i6D8TdBThK0GAzXjKmyuERERETqkvK+H3VqJbpIZfB0s/H2Ve3oHBvE85M38MfGZAZ/sICPb+xEi4i6/UH1MJsLDP3s+I85HGAvAavL8RPkvR8zbVf2r4RNv0HLweW/7tofTQLdxRMGvnb0Y62vgFnPQ3YibPjF/GxZREREpBI5HA6nVKJvTspiyc40bFYLN3SLPfrBFd/A74+CvRjqtYCBo6osLhERERE5vho/WFTkeCwWC9d3q8/P9/YgKsCT3al5XP5/CxmzeDel9jr144vTZ7GAzfXEFeY+odBjuFmf81L5h5PmZ8AfT5n18/4Dgf/6wOjiBt3uMuuLPjTJfBEREZFKlFWURbG9GKjaJPq3i00v9P4tw4gM8DQbS4pgyiPw2wMmgd7iUrhjJvhHV1lcIiIiInJ8SqJLrdY2OoAp95/DeU3rUVBs55lfNzD040WsT8h0dmg1W8/7wTMIUrbCmrHlO+bPVyD3IAQ3gR73H3+fTreCqxckr4Nd8058rr3L4ONe8OPNpse6iIiIyBk4NFTU19UXd5t7lVwzM6+YiWVtB2/uGWc2ZifDt4Nh+ZeABc5/Gq4eA+6+VRKTiIiIiJyckuhS6wV6uzH6li68MLgVvu4urNmbweAPF/D85A1kFxQ7O7yaycPPtHUBmPtaWR/1k9i/Cv7+wqwPeuvE/c69gqDDjWZ90YfH32f1WPh6kBlCunESfNwDJt4DabtO+2mIiIhI3eaMVi4/rdhLfnEpzcJ86dYgCPatgM/6QPxicPeH68dD7/+c3twZEREREalUSqJLnWC1Wri5ZxyzHz2PS9tFYnfA14t2c8Hb8/htzX7q2HzditH5dvCLhqyEIwny40neAOOHgcNu+p437HPy83a7B7DA9plHV5nbS+GPZ2DSvVBaBM0GmZ85O+ywZhx82BmmPAxZ+yvi2VUuux12zYfiAmdHIiIiUqcdqkQP8giqkuvZ7Q7GLDGtXG7uGYdlxxwYfRFk74eQZmZoe9MBVRKLiIiIiJSfkuhSp4T6efDBdR0Yc3tXGoR4cyC7kPvHrWLYV8vYnZLr7PBqFlcP6DvSrP/1NhQcp0XOlmnwZX/IjIfABjCgHIOxghtB80FmfclH5rYgC8ZdB4veN/d7/xeu+c4sd/4JjS4ww1CXfwXvd4AZT0HKturbV33Re/DNpfD9lVCqX0OIiIg4S1VXos/bepA9qXn4ebhweUQK/DgMSguh6UC4YxaENK6SOERERETk9CiJLnXSuU3qMe3Bc3moXxPcXKz8tS2F/u/O58M52ygqsTs7vJqj7bWmaio/HRa+f2S7wwEL3zOJ76IciDvXVFb5hpXvvD3LeqavGW/6n395IWybAS4ecMWXcP5TYC37v6+ojnDTL3DLVKjfA0oKYPGHpjL9vXZmQNfmqVCYXbHP/UwVZpvXBmD3XzD1seqb7BcREanlDiXRQzxDquR6Xy/aDcAdbVzx/LHsfVKD80z/cw+/KolBRERERE6fkuhSZ3m42nioX1NmPNSbc5uEUFRi560/tnLx+3+xbFeas8OrGWwucMGzZn3J/5mhWCWFMOk+mPks4DDDQm+aaPqdl1dMN4jqbCqzvrwQDm4G3wi4dSq0ufL4x8T1glunwQ0/Q8O+YHODjD1mQNcP18HrDeDrS0zV/ObfIXkjFOWd9Utw2v7+0nzp4F0PsMCKr81rJyIiIlXuUDuXYI/Kr0TflZLLvK0H8bfkcE/C45CTBKEt4ZoxJ54XIyIiIiLVgpLoUuc1CPHm29u68t617QnxcWP7gRyu/nQxT0xYS0ZekbPDq/6aDzIJ7+I8+ONp+GYwrBkLFitc9AZc8g7YXE/vnBYL9Bh+5H5kR9O2JarTqY9rciEMmwSP74brf4Sud5lWMvZiU/k9+0X44XozkPTVCHirKXw5AH65GxZ9AIU5p/sKlF9RrrkGwIUvwoBXzPqMp2DL9Mq7roiISDl99NFHxMXF4eHhQbdu3Vi2bFm5jvvhhx+wWCwMGTKkcgOsYFXZzuXbxbtxo5gf/D/CLW0r+EbCDT+Bh3+lX1tEREREzo6LswMQqQ4sFguXtY/ivKb1eH36ZsYt28sPf+9l5sZknhrUgsvaR2GzWpwdZvVksUC/5+GbS2Ddj2abuz9cNRoaX3Dm520x2CTAbW5w/tPg6nl6x7t5m8Fch4Zzpe6AHXNgz0JI2wXpu6EgA3KSzbJ3CawFln4Gg96Gpv3PPPYTWfE15KVAYBy0uQqsLnBwC6z8BibcDrfNgPDWFX9dERGRchg/fjyPPPIIn3zyCd26dePdd99lwIABbNmyhdDQ0BMet3v3bh577DHOPffcKoy2YhxOoldyJXpuYQkTlsfzhuuntChYA26+JoHuH12p1xURERGRimFxOOpWM96srCz8/f3JzMzEz099B+X4lu9O48mJ69iabKqSY4I8ual7LNd0ro+/12lWVdcVY4bCjtkQ1BCuGw/1mjo7olPLTzfJ9LRdkLbTJLMz4s1jra+Aga+BzwmSBg4HJKyAjZMgpCl0HHbyaxXnmx7tOclw6fvQ6WazvbQYxlxuquT9Y0zv+BNdU0REaoXq+n60W7dudOnShQ8//BAAu91OTEwM999/P0888cRxjyktLaV3797cdttt/PXXX2RkZDBp0qRyX9PZr0X/n/uTmJvI9xd/T9t6bSvtOmOW7CF7ytPc5zIZh9UFyw0/QaPzK+16IiIiIlI+5X0/qnYuIsfROS6IKfefy38HNiPAy5W9afm8OnUz3UbNYuQv69iclOXsEKufK7+Cyz6CO2bXjAQ6gGcgRHaA1kOh92Nw3xLoMcK0olk/AT7sAivHHD34M20XzH0dPugEX1xg2rNMvh/W/HDya60cYxLo/jHQ7roj222ucPW3ENQIMveaVjPFBZXzfEVERE6gqKiIFStW0K9fv8PbrFYr/fr1Y/HixSc87sUXXyQ0NJTbb7+9KsKsUA6Hg5T8FKBy27k4HA7S5n7MfS6TAbAM/kAJdBEREZEaRu1cRE7AzcXKfX0ac2vPBkxek8DohbvZnJTNuGXxjFsWT/eGQdzaqwH9W4ZhsajVC54B0OFGZ0dxdty8TZ/yNlfC5AcgaS1MHgFrx0OLS2H9L6btyyGuXhDWCvb9bfYPbgzRnY89b0khLHzXrJ/z0LHDw7yCTP/2Ly4w5/p1OFzxhWmVIyIiUgVSUlIoLS0lLCzsqO1hYWFs3rz5uMcsWLCAL7/8ktWrV5f7OoWFhRQWFh6+n5XlvMKE7OJsiu3FQOW2c1mz+m9G5H8CFig89wnc219fadcSERERkcqhSnSRU/B0s3FNl/pMe/Bcxt/VnYvbhGOzWliyM427x6zgso8WsnB7irPDlIoU2cEMMr3wJXDxNK1Wpv3XJNAtVmjYFy7/FB7bBrf9Ac0GQWmhqSLPTDj2fKvHQlYC+EZA+xN80RDS2FSkW11g/c/w082m3YyIiEg1lJ2dzU033cTnn39OSEhIuY8bNWoU/v7+h5eYmJhKjPLkDvVD93H1wcPFo9Kuk/bX59gsDrb4dsP9/OO3xRERERGR6k2V6CLlZLFY6NYwmG4Ng9mfkc+YJXv4dtFu1u7L5IYvlnJukxAeH9ic1lH+zg5VKoLNBXo9AC0Hw8znIDvRVKO3vhL8Io7ed+in8GV/OLDRJNJvnQZuXuax0mJY8D+z3utBcD3Jh/SG58HgsvYwG3+FfSvgis8htmflPEcAux2sFfh96qrvzZcGDvvxHw9rCRc8Bx7VpwewiIhASEgINpuN5OTko7YnJycTHh5+zP47duxg9+7dXHrppYe32e3m//tdXFzYsmULjRo1Oua4kSNH8sgjjxy+n5WV5bRE+uGhopXYyiU9K5e2qTPAAu7d79SvzERERERqKCXRRc5AZIAnjw9szu3nNODDOdv5fuke/tqWwl/bFnBJ2wge69+MuBBvZ4cpFSEwDq7+5uT7uPvCdePg8/MhcbVpAXPFl+aD8trxZlipdyh0vPnU12t/PdRrBj/fDum74OtB0Ps/0Pu/JrFfUUpLYMn/wbw3TPJ+yMdnn9he9T38et/J94lfBDvnwjXfQWiLs7ueiIhUGDc3Nzp16sTs2bMZMmQIYJLis2fPZsSIEcfs37x5c9atW3fUtqeffprs7Gzee++9EybG3d3dcXd3r/D4z0RqQVkSvRJbuSyfNZ4LLZmkWwKI6z6k0q4jIiIiIpVLSXSRsxDi487zg1txW68G/G/mFn5ds58paxOZvj6J67vV56F+TQnydjv1iaTmC4yDq8fAt4PNUNLQFtDrYfjrbfN4z/uPVKefSlQnuOcvmPpfWDMW5r1uEs9DP4fA2LOPNWkd/DrCJPwBNk+Br3bC9eMhoP6ZnXP7bPjtAbPe+XaTmP+3ojyY8zKkbofPL4DLPoDWV5z4nKXFpqp97XjzBUS7a84sNhERKZdHHnmEm2++mc6dO9O1a1feffddcnNzufXWWwEYNmwYUVFRjBo1Cg8PD1q3bn3U8QEBAQDHbK+uKrsS3eFw4LXRDB7fH3sZgTbXSrmOiIiIiFQ+JdFFKkD9YC/evbYDd/ZuyBvTtzBv60G+XbyHiasSeOD8JtzcMw43F40gqPXiesGgt+G3B02yOGU7pO0EzyDofNvpncvdFy7/GBpfAFMehr1L4ZNz4IJnwTfcJJjtJUdu7cXgFQyx54BPveOfs7gA5r8BC98zx3j4Q88HYNlnphXN5+fDteMgpsvpxZq4Bn4cZs7Z5mq4+K0Tt4hpciH8fBvsmmdu962AC1+AfyYWSktM4nz+G5C+22zLTVESXUSkkl1zzTUcPHiQZ599lqSkJNq3b8/06dMPDxuNj4/HWpEtwJwsJd/MtAnyCKqU86/ZvJVuxX+DBWL73VUp1xARERGRqmFxOBwOZwdRlbKysvD39yczMxM/P/XklcqxaEcKL0/ZxMbELABig70YeVELBrQKw6JemLXf1P/Csk+P3L/gWTj30TM/X/oe+OVOk0gvj9BW0KC3qQaP7WmS5XsWweQHIHWb2aflZXDRm+AbBpn7YOy1kLwObO4w5P+gzZXlu1ZGPHzRD3KSzTVvmAAup/j1RWkJ/PkyLHjH3I/tBVeOBu8QWPczzHvNfPkA5ouBvFQz0HVkQvmr+UVEqjG9Hz3Cma/F84ueZ8K2CQxvP5x72t1T4eef/PFIBif/H3s8WxL7+OIKP7+IiIiInL3yvh9VJbpIJejZKITf7j+HCSv28eYfW9iTmsc9362ge8Mgnh7UUsNHa7sBr0LKFtOCxSMAutx5ducLjIVbpsKi92DLdJNQtrmC1QZW1yPrabtNIvzABrMs/RgsNtNaJnm9OZdPOAx6ywxJPcQ/Gm6bbhL1W6bChNshZRv0eeLkA9Dy0uC7K0wCPbSV6XN+qgQ6mN7u/Z43bWsm3gt7FsJn55nq+5StZh+vYOj1EHS5Hd5rB7kHTbV8dOczfBFFRESOVpntXDLzimiRNBksQIcbK/z8IiIiIlK1lEQXqSQ2q4Wru8RwcdsIPpm7g8//2smSnWlc+uECBreL5M5zGyqZXlvZXOCqr2H2S9C439kP7Dx0znMfPXVFe24q7J4Pu+bDznmQtuNIAr3jzXDhi+AZcOxx7j4mCT7rOVj0gakGT9lqqugDYo9tz1JcAD9cb/bxi4IbfjIV76ejxaUQ0gzG32i+dMhONF869HoAut5tYgIIbws7Zpu2MUqii4hIBanMwaIL5s1gkGUfBbhR/9wbKvz8IiIiIlK1lEQXqWQ+7i48NqAZ13Wrz+vTNjN5zX5+XW2Wno2CubN3Q/o0rac2L7WNZyBc8r+qv653MLS63CxgWrXEL4GghhDV8eTHWm3Q/2UIaWr6sG/4xSxuvhDWEsJaQ3hrCGsDiz+A+MXg7g83/Az+UWcWb72mcOccMzzVM8BU7f/7S4eIsiR60tozu4aIiMhxVFYlusPhgFXfAZAQ3o9Gx/vyWkRERERqFCXRRapIVIAn71/Xgbt6N+Tzv3YyZW0ii3aksmhHKk1Cfbjz3IZc1iESdxebs0OV2sQ/uvz9zQ/pOAwCG5iq9KR1UJRt+rH/uye7zQ2u/d4k2M+Guw/0f+nEj4e3MbdJ687uOiIiImUcDsfhwaIVXYm+dncS5xbOAwuEnXdHhZ5bRERERJxDSXSRKtY6yp/3ru3Afwc25+uFuxi3bC/bDuTw3wlreWPGFq7pEs3QjtE0qufj7FClLmtwrqkQLy02/dGT15slqew2Px0u/8TsV9nC25nb5A1mKKlN/+kSEZGzk1OcQ5G9CKj4SvRNs7+nnSWfVNdwgpv1rdBzi4iIiIhzKBMh4iRRAZ48Nagl91/QhB+WxTN64W4SMwv46M8dfPTnDtrFBHBFxygubRtJoHc5hjWKVAaba1krl5bA1Ue220tN+5eqENQQ3HygKAdSt5lBqSIiImfhUCsXb1dvPF08K+y8OYUlxO6dCBbIb3nNsTNFRERERKRG0rs6ESfz83Dlrt6NmP/fvnx0fUcuaB6KzWphzd4Mnv11A11fncXdY5YzY0MSxaV2Z4crYlRVAh1MAiKstVlPVF90ERE5e5U1VHT2or/pxgYAovrcVqHnFhERERHnUSW6SDXharMyqG0Eg9pGcDC7kMlr9vPLyn1s2J/FjA3JzNiQTIiPG1d0jObqLjFq9yJ1S3gb2LvEDBdtd42zoxERkRqusoaK5v49BqvFQUJgV6IC4yr03CIiIiLiPEqii1RD9Xzduf2cBtx+TgM2J2UxcWUCE1YmkJJTyKfzd/Lp/J10iQvk6s4xDGobgZeb/ilLLRfR1twmqRJdRETOXmVUoq/fl865OX+AFfx63FJh5xURERER51PmTaSaax7ux8iL/XhsQDP+3HyAH5fvZc7mA/y9O52/d6fzwm8bubRdBOc3D6NHo2B83PXPWmqh8LIkeuJacDjAYnFuPCIiUqOl5KcAFVuJvuzPX7nNepA8qze+HYZW2HlFRERExPmUbROpIVxtVvq3Cqd/q3CSMguYsHIf4//eS3xaHuOW7WXcsr24WC10jA3kvKb16N2kHq0i/bBalWyUWiC0BVhdoCADMvdBQIyzIxIRkRrM382fJoFNiPGtmP+eFBSXUm/7z2CBrEaD8XKtuGGlIiIiIuJ8FofD4XB2EFUpKysLf39/MjMz8fPzc3Y4ImfFbnewZFcqU9clMn9rCvFpeUc9HuztRp9moVzXNYZOsYFYVL0rNdnHvSB5PVw7FpoPcnY0IiJnTO9Hj6gtr8XclZvo/uu5eFiKsd8+G2tMZ2eHJCIiIiLlUN73o6pEF6nBrFYLPRuF0LNRCAB7UnOZv/Ug87amsHhHCqm5RUxYuY8JK/fRNMyHG7rFcnnHKPw8XJ0cucgZCG9rkuiJa5VEFxGRaqV40Yd4WIpJ8GpOVHQnZ4cjIiIiIhVMSXSRWiQ22JubenhzU484ikvtrNiTzsSVCfy6JoGtyTk8N3kDr03bzOB2kdzQvT5towOcHbJI+UW0hTVjNVxURESqlaLsNHqkTAAgt+vDmtshIiIiUgspiS5SS7narHRvGEz3hsE8OagFk1Yl8P3SPWxNzmH88r2MX76X5uG+DGwdzsDW4TQL81W7F6neDg0XTVrn3DhERET+IeGP92hAPtupT6Nzr3J2OCIiIiJSCZREF6kD/D1dublnHMN6xLJ8Tzpjl8bz+7pENidlszkpm3dnbSMu2IsBrcMZ2CqcdtEBGkgq1U94a3ObuRfy0sAryLnxiIiIFGYTtvErAJbXv43GNpuTAxIRERGRyqAkukgdYrFY6BIXRJe4IJ67tCWzNh1g+vok5m87yO7UPD6dt5NP5+0kzM+dPk1D6dYwiG4Ng4kK8HR26CLg4Q+BcZC+27R0adjHyQGJiEhdZ//7K7xKs9hpDyeq13XODkdEREREKomS6CJ1VICXG1d2iubKTtHkFpYwd8tBZmxIYs7mAyRnFR5u+QIQE+RJtwbBdGsQRPeGwcQEeTk5eqmzwtuWJdHXKYkuIiLOVZxPyYL3cANGW4fybONQZ0ckIiIiIpVESXQRwdvdhUFtIxjUNoLCklIW70hl8c5UluxMY31CJnvT8tmbto+fV+wDoHm4L5e0jeCStpHEhXg7OXqpUyLawqbJkKjhoiIi4mQrv8WtIJV9jhAKW12Jq83q7IhEREREpJIoiS4iR3F3sdGnWSh9mplqqpzCEpbvTmPprjSW7kxl7b7Mw73U3/pjK22i/LmkLAEfHagKdalkh4eLKokuIiJOVFKIY+F7WICPSwYzoE20syMSERERkUqkJLqInJSPu8tRSfXMvGJmbEzitzX7WbQjlXUJmaxLyGTUtM20jwmgV+NgOscF0bF+IP6erk6OXmqdQ0n0lK1QlAdu+uJGREScYM04LFkJJDkCmeZyPs80DnF2RCIiIiJSiZREF5HT4u/lytWdY7i6cwypOYVMW5/ElLX7WborjdV7M1i9NwPYgcUCzcJ86RwXSOfYIDrUDyAqwBMX/dRZzoZvOHjXg9yDcGATRHdydkQiIlLXlJbAX/8D4LOSS+jVOhoPV5uTgxIRERGRyqQkuoicsWAfd27sHsuN3WNJzirgz80HWL4nneW709idmne47ct3S+IBsFktRAZ4EBPoRUygF/WDvYgO9KRFhB9NQn2wWCxOfkZS7Vksphp9x2xIWqMkuoiIVL31P0PGHtLxZ1xpX95uHe7siERERESkkjk1iT5//nzefPNNVqxYQWJiIhMnTmTIkCEnPWbu3Lk88sgjbNiwgZiYGJ5++mluueWWKolXRE4szM+Da7vW59qu9QE4mF3Iij1pLN+dzt970tm0P4uiUnvZkNJ8IPWo45uE+nBZ+0gGt4uifrBadMhJhLcxSXQNFxURkapmL4W/3gbgs+KLcLh60adZPScHJSIiIiKVzalJ9NzcXNq1a8dtt93G0KFDT7n/rl27GDRoEPfccw/ff/89s2fP5o477iAiIoIBAwZUQcQiUl71fN0Z2DqCga0jALDbHRzILmRveh7xqXnsTc8rS6jnsXpfBtsO5PDWH1t564+tdKgfwGXtIhnUNpJ6vu5OfiZS7UQcGi66zrlxiIhI3bNpMqRspcDmy5iCfpzXvB5ebvpxr4iIiEht59R3fBdddBEXXXRRuff/5JNPaNCgAW+/bao/WrRowYIFC3jnnXeURBep5qxWC+H+HoT7e9AlLuiox7IKipmxPonJa/azcHsKq+IzWBWfwYtTNtIlLohzm4TQq3EIbaL81VNdILyduU3eYCoCrepDKyL/4nBARjzEL4G9S83/T0S0h8j2ENIMbEp6yhla+D4AP9oGkYMXF5UVC4iIiIhI7VajPkEsXryYfv36HbVtwIABPPTQQ84JSEQqhJ+HK1d1juGqzjEcyC7g97WJ/Lp6P6v3ZrB0VxpLd6Xx1h9b8fVwoXvDYM5pbJLqDUO8sVrVR73OCWoIrt5QnAsp2yC0ubMjEpFDSksgfjFsngLbZ4HFCv4xEFAfAmLA/9BtNHgFg4uHmXVQHsUFUJx34scz95qkefxiiF8K2fuPv5+LJ4S3PpJUj+wAYa1O95lKXZQRD/tX4rBYeS/rPFxtFs5vEersqERERESkCtSoJHpSUhJhYWFHbQsLCyMrK4v8/Hw8PT2POaawsJDCwsLD97Oysio9ThE5c6G+HtzaqwG39mpAfGoe87YdZOG2FBbtSCGroISZG5OZuTEZAFebhVBfD8L83An39yDMzywR/h40C/elSagvNiXZax+r1STA9i6FpLVKooucjeJ8SN4Iiashcx94+INXEHgGgWfgkXUPf3BxP37Cu7gAds6Fzb/BlmmQd/TMC1K2nvj6Njdw9zPnP7S4ekFRDhRmQUFW2W0mlBad3nOzuphEef3upjI9cTUkrjHn3ve3WcAk9h9Weygphy3TANjv247UfH/6Ng7Bz8PVyUGJiIiISFWoUUn0MzFq1CheeOEFZ4chImegfrAXNwXHclP3WErtDtYnZLJwRwoLt6fw9+50ikrsJGTkk5CRf9zjPV1ttI7yo210AG2j/WkXHUBssBeW8lY9SvUV3vZIEr3t1c6ORqR6Ki2BknyTKC/OM7d5aWaeQOIasxzcDI7S8p3PYjW/AnHzMoluN29TSX5ws0lMH+IZCE0vguaDwN0HMvaaKvHDt/GQlQD2EpMYz0sxy9ly84WYrlC/h0mcR3Uysf6T3Q5pO2D/apNU378aAmPP/tpSN2yZCsC04g4AauUiIiIiUofUqCR6eHg4ycnJR21LTk7Gz8/vuFXoACNHjuSRRx45fD8rK4uYmJhKjVNEKp7NaqFdTADtYgK4r09jikvtHMwuJCmrgOTMAnObVUhyVgEJ6fls2J9JblEpf+9O5+/d6YfP4+vuQj0/dwK93Aj0ciPI29Wse7sRHejJBc3D8HRTj+1q79Bw0cS1zo1D6i67vaxCOgPy081SXAAhTU3LIetZzG9wOMy589NNVXdeGuSWJZrzUsvW00ziuqTAJMdLCk3CvKTwSNsTe3H5rucVYtqaBDaAwmzITzPnz0836/kZgAMcdijKNsu/+UWZpHmLS6F+z1P3HHc4TPwFmWVL1pH14lxw8ymrUPc7+tbNGzjBF6FW26lbw1itENLELG2vOvVrI3JIfgbsXgDAdxmtsFkt9GsZdvJjRERERKTWqFFJ9B49ejB16tSjts2cOZMePXqc8Bh3d3fc3d0rOzQRqWKuNiuRAZ5EBhz/C7RSu4OdB3NYsy+TtfsyWLMvk037s8guLCH7YAmQe9zj/D1dubpzNDd2jyU22LsSn4GclfCyJHrSWpOM068LpLIU55vK7YQVkLDSVG/nHjTJc4f9+Me4+5m/0Yh2Jjkd0R4C40wSPDsRshLNbXYiZCdBzgGTsD6ckM8of3V4uVhM5birp6kMD21pYju0+Eac/N+Q/VDyPM8k54tyj771izJ9xU/n36HFAu6+ZvGPPvunKFLZts8CewnpXg3YXRBBz4ZBBHm7OTsqERGpAex2O0VFp9mWTkQqjKurKzbb2RdLOjWJnpOTw/bt2w/f37VrF6tXryYoKIj69eszcuRIEhIS+PbbbwG45557+PDDD/nvf//Lbbfdxpw5c/jxxx/5/fffnfUURKSaslktNAnzpUmYL1d2MgmaohI7e1JzSc0tIiOviLTcYtLzikjLLSI9t4hlu9PYl57P53/t4osFu+jTtB7DesZxXpN6GmBa3YS2MP2O89NNH+cA/cKoxigtMW1BzqRS2+EwSduCTJNoLsg8knjOOWCS2zkHICf5yLq9xCSJ/SLALxJ8I8vWo0xiubQQSorKbg8tBaZFScIKSN5gznEiLp6mfYlngPmbTNlqqsj3LDDL2XD1KutLHgzeIebW69BtkEnWu7ib5LiLh1lcPUxMrocWrxP3Mi8vq/VIv3KRuqqslcufdAHgotbhzoxGRERqiKKiInbt2oXdfoLiCxGpEgEBAYSHh59Ve1+nJtGXL19O3759D98/1Hbl5ptv5uuvvyYxMZH4+PjDjzdo0IDff/+dhx9+mPfee4/o6Gi++OILBgwYUOWxi0jN4+ZiNYn1Ezxeanfw5+YDfLtkD/O3HuTPLWaJDfZiQKtwPF1tuLlYcbVZcLVZcbVZcbNZqefnTssIP0J93dVvvaq4uEO95pC83lQJK4lecYoLTL/qjHjzBUV2YllLkbK2InmpZe0+0k21dECsqbL+9+KwQ/ouSNv5j2WX6YltsYFvuElu+4aXJbcjwCfMtPLITTVJ8NyDZe1LDpoWJgWZ5W9R8k8FGXBw05m/Jt71TH/tqE6m4to/2iS3PQJM0vqfSksgZcvRPbeT1plWK4ef96HnXpbc9w4tG+AZeGQ53rlFxDlKimDbTADGZrYCoG/zUGdGJCIiNYDD4SAxMRGbzUZMTAzWs2n3JyJnxOFwkJeXx4EDBwCIiDjzmTYWh8PhqKjAaoKsrCz8/f3JzMzEz8/P2eGISDW1KyWX75bs4cfle8kuOEkV6j8Ee7vRIsKPFhG+tIz0o0WEH43q+eBq05ulSjHxXlgz1lQUR3eG0FYQ1tK0qgiMM/2Rnc1uh6x9pt9zUY5ZCnNMG4yiXJMwdtjLFkfZUna/tNDsW5h9ZCkqu7XYTMLZJ/TY29Ji0zYk95/9s8t6aAPYXMHmZqqmbW7mPkDWfpM0zz3gvNervCw2U/nt4W+SzR7+Za9BqElI+4SaxLdPqHmeh1qoZO2H7P1l6wmm4tzmbr6UcXE3r8eh28BYiOpsEuf+0WdXyW0vNdXynoHV4+9SnE7vR4+oEa/Fjjkw5nKKPEJolvEu4f5eLB55gbOjEhGRaq64uJjt27cTGRmJv79+0SfiTKmpqRw4cICmTZse09qlvO9Ha1RPdBGRqtIgxJtnLmnJo/2bMmVNIpuSsigpdVBcaqeo1E5xqYPiErMen5bHzoM5pOYWsWB7Cgu2pxw+j6vNQoMQb5qG+dKsrL1Ms3Bf6gd5YVOLmLPT7CJY+4NJhm5MgI2/HnnMxdMMd7RYTCuO0mJzay89Usl8qNXFUbee4OZrErSeAUcqgg9XB/ubHs5uPmbffyZWS4tNC5DEtaZvdtJaU4FclFM5zz91W+WcF8zr4R9jksf+UWUtRIJMGxHPoCPrDgdk7Ib0PZC++x/LHjP7MajhkSWwQdltnKlgz0o0Ce3spLLkdqJpw+LmY1qXeNcz1/UuW7xCjvxv4OZ9eknt0BaV8SqVn9VmnoOI1ExbpgGwLeAcHBlWOsYGOjkgERGpCUpLzYwbNzfN0BBxNi8vL8B8uXWm/dGVRBcROQkvNxeu7nLqViEFxaVsTc5m4/4sNiVmsSkxm02JZpDp1uQctibnMIXEw/u7uVip5+NOkLcbgd5uBHu7EejlRpC3K6G+HrSvH0CTUB+1hzmZloPh0S0mUX1gIyRvhAMb4OAW0zrjwIbKvb7FZoY0uvuZXtQZe6D0OAODbG4mEe/mbfZ3O7R4m2S11WYSwhbr0YvV9cjgxcOLnzlHabFJOB/q//3PW5vrkaSzd/CRRLRnkDmvvdjEWVpyZN1hB59wkzQPqG+S1eX92wtpfGavn4ZJikhN4HDAZtMPfWZpRwA6K4kuIiKnQZ/pRJyvIv4dKokuIlIBPFxttI0OoG10wOFtDoeD/ZkFbE3OZmtSNluSs9manM225BwKS+wkZOSTkJF/wnMGe7vRtUEQ3RoE0a1hMM3CfDXg9N98QqHxBWY5xF5q+m+n7zEDEa2upqWH1QVsZbcOh2nlUZwHxflHbovyTMuU/AzTfiM/vWyIZdn6obYqOEw1dUGmWQ5x94PwthDRDiLKboObmOuKiEjNk7QWsvbhcPVi7MGGAHRSEl1EROS0xMXF8dBDD/HQQw+Va/+5c+fSt29f0tPTCQgIqNTYRMpLn+pFRCqJxWIhKsCTqABP+jY7MoCs1O5gf0Y+KTmFpOcVkZpTRHpeEWm5xaTlFrI3LZ9Ve9NJzS1i2vokpq1PAiDAy5WO9QNpGOJNXIg3ccHexIV4EenvqeT6P1ltENLELJXBbjdJ93/2KS/KLavijjOJexERqR3KWrnkRp/LgU1WPF1ttIiopr3bRUREztKpqnWfe+45nn/++dM+799//423t3e59+/ZsyeJiYmV2kv+lltu4Ztvvjnh47GxsezevbvCr/vZZ58xduxYVq5cSXZ29ml9UbB48WLOOeccBg4cyO+//17hscnJKYkuIlLFbFYLMUFexAR5nXCfohI7a/dlsHRXGkt2prJiTzoZecXM2XyAOf/a183FSv0gL6IDPann406Ir/vh2xAfN0J93YkK8MLTTQMNK4TVWtbGxQc488neIiJSA2w2H1DX+54DQLsYfw0MFxGRWisx8UgL0vHjx/Pss8+yZcuWw9t8fHwOrzscDkpLS3FxOXVqsV69eqcVh5ubG+Hh4ad1zOl67733eO211w7fj4iIYPTo0QwcOBDgjPtmn0peXh4DBw5k4MCBjBw58rSO/fLLL7n//vv58ssv2b9/P5GRkZUSY3kUFRXVuX7/egcoIlINublY6RwXxPC+jRlzezfWPNefiff15KXLWnH7OQ24oHkoDet542qzUFRiZ/uBHOZuOchPK/bx8dwdvDhlIw+MW8X1ny+l3//m0/K56fR580/uHrOc//2xhd/XJrL9QA4lpXZnP1UREZHqKXOfaedisTKtsB0AnWODnByUiIhI5QkPDz+8+Pv7Y7FYDt/fvHkzvr6+TJs2jU6dOuHu7s6CBQvYsWMHl112GWFhYfj4+NClSxdmzZp11Hnj4uJ49913D9+3WCx88cUXXH755Xh5edGkSRMmT558+PG5c+disVjIyMgA4OuvvyYgIIAZM2bQokULfHx8GDhw4FFJ/5KSEh544AECAgIIDg7m8ccf5+abb2bIkCHHfa7+/v5HPV+AgICAw/c3btxI165dcXd3JyIigieeeIKSkpLDx/fp04cRI0YwYsQI/P39CQkJ4ZlnnsHhcJz0Nf7/9u47Oqpq7eP4dyZl0kN6QgmhEzpSFFHAC94gyhVFKaKAoIgCgogCKkiRLh3UV4REFEW5imJFQOBq6GAo0jEQWkho6X3m/SMwMoQEgsAE8vusNSsz5+xz9jMnh8XOM3uePWjQIIYNG8Y999xzLb8Sq9TUVL744gtefPFFHn74YaKiogq0+e6772jSpAkuLi74+/vz2GOPWfdlZWUxdOhQKlSogMlkomrVqsyfPx/4+/pe6ptvvrH5ZsKoUaNo0KABH330EZUqVcLFxQWAn3/+mfvuu8963R955BEOHTpkc65jx47RtWtXfH19cXd3p3HjxmzcuJHDhw9jNBrZsmWLTfsZM2ZQsWJFzOaSla/QTHQRkduAk4ORhqE+NAy1rcN6sTRM7Ok0TiZlcDo1m8SULBJTszidksXp1CwSUrJIyczl8Jl0Dp9JZ/mfp6zHOzsaqR7kQXiwF+Eh+Y9aIV54uznd6rcoIiJSslwo5UKFu/nf8fw/iFUPXURESrthw4bx7rvvUrlyZXx8fDh69Cjt2rVj3LhxmEwmFi5cSPv27dm3bx+hoaGFnmf06NFMnjyZKVOmMHv2bLp168aRI0fw9b3yB9bp6em8++67fPLJJxiNRp5++mmGDBnCokWLAJg0aRKLFi0iMjKS8PBwZs6cyTfffMMDDzxQ7Pd4/Phx2rVrR8+ePVm4cCF79+7l+eefx8XFxaaczccff0zv3r3ZtGkTW7ZsoU+fPoSGhvL8888Xu8+r+fLLL6lZsyY1atTg6aefZtCgQQwfPtya6P7hhx947LHHePPNN1m4cCHZ2dn8+OOP1uO7d+/O+vXrmTVrFvXr1yc2NpbTp08XK4aDBw/y1Vdf8fXXX1tn6qelpTF48GDq1atHamoqI0eO5LHHHiMmJgaj0UhqaiotW7akXLlyLFu2jODgYLZt24bZbCYsLIw2bdoQGRlJ48aNrf1ERkbSs2dPjCWsVKqS6CIit7FrKQ0DcDo1i33xKeyNT2FfJOfT6gAAUJtJREFUfDL7TqWyPz6FjJw8dh1PZtfxZJv2Zb1dqB7siYfJEUejAaPRgKPRgIPRiKPRgJvJgeZV/Lmnsh/OjiXrPzYREZEb4kIpl7RK/yZ2fxoAd4UqiS4iItfHYrGQkZNnl75dnRyuWu/8Wo0ZM4YHH3zQ+trX15f69etbX48dO5alS5eybNky+vfvX+h5evbsSdeuXQEYP348s2bNYtOmTdZyKpfLycnhgw8+oEqVKgD079+fMWPGWPfPnj2b4cOHW2dfz5kzxyaJXBzvvfceFSpUYM6cORgMBmrWrMmJEycYOnQoI0eOtCZ3K1SowPTp0zEYDNSoUYOdO3cyffr0m5JEnz9/Pk8//TQAbdu2JSkpibVr19KqVSsAxo0bR5cuXRg9erT1mIu/l/379/Pll1+yYsUK2rRpA0DlypWLHUN2djYLFy60Kc/TsWNHmzYLFiwgICCA3bt3U6dOHT777DMSExPZvHmz9QOSqlWrWts/99xz9O3bl2nTpmEymdi2bRs7d+7k22+/LXZ8N5uS6CIipYC/hwn/qiaaV/W3bjObLcSdTWdvfDK7T6aw52Qye04mc+xcBieSMjmRlFnkOf9v7V94mhxpWSOAf9cOplWNALxcNINdRETuAJlJcPh3AP5wbQacpVqgh76pJSIi1y0jJ49aI5fbpe/dYyJwc74xKcBLZwxDfpmRUaNG8cMPP3Dy5Elyc3PJyMggLi6uyPPUq1fP+tzd3R0vLy8SEhIKbe/m5mZNoEN+DfOL7ZOSkjh16hRNmza17ndwcKBRo0bXVRJkz549NGvWzOaDh+bNm5OamsqxY8esM+zvuecemzbNmjVj6tSp5OXlMWnSJMaPH2/dt3v37iJn5hdl3759bNq0iaVLlwLg6OhI586dmT9/vjWJHhMTU2jyPiYmBgcHB1q2bHld/V9UsWLFAvXtDxw4wMiRI9m4cSOnT5+2Xu+4uDjq1KlDTEwMDRs2LPQbBh06dKBfv34sXbqULl26EBUVxQMPPEBYWNg/ivVmUBJdRKSUMhoNhPm7E+bvTts6fy+QmZyZw96TKRxMSCU7N49cs4U8s4U8i4W8PAu5ZgunkjNZtTeBxJQsvt9xku93nMTJwcA9lf24K9SH1KxczqVlcy49m7PpOZxPz+ZsWjYmRyPVAj2pHuRBtSBPagR7Uj3QU0kJEREpWQ6uBHMO+Ffnt3NlgLM0DtMsdBEREXd3d5vXQ4YMYcWKFbz77rtUrVoVV1dXnnjiCbKzs4s8j5OT7d+ABoOhyIT3ldpfrf64PfXt25dOnTpZX/+TRUDnz59Pbm6uzTksFgsmk4k5c+bg7e2Nq6troccXtQ/AaDQWuJY5OTkF2l3+uwdo3749FStWZN68eZQtWxaz2UydOnWsv/+r9e3s7Ez37t2JjIzk8ccf57PPPmPmzJlFHmMvSqKLiIgNLxcnmlbypWmlohdPM5stxBw7z4rdp1ix+xQHE1L57cBpfjtQeF21FOB06hnW/3XGZnuQlwl/DxOORgOODkYcjAacHAw4Go04OxrpeW+YzSx6ERGRm2rvha9/12jH1oPnAJVyERGRf8bVyYHdYyLs1vfNEh0dTc+ePa1lVFJTUzl8+PBN6+9KvL29CQoKYvPmzbRo0QKAvLw8tm3bRoMGDYp9vvDwcL766issFot1pnl0dDSenp6UL1/e2m7jxo02x23YsIFq1arh4OCAr69vobOviyM3N5eFCxcydepU/v3vf9vs69ChA59//jl9+/alXr16rFq1imeffbbAOerWrYvZbGbt2rXWci6XCggIICUlhbS0NGuiPCYm5qqxnTlzhn379jFv3jzuv/9+AH7//XebNvXq1eOjjz7i7NmzhV6P5557jjp16vDee++Rm5vL448/ftW+7UFJdBERuS5Go4G7Qn24K9SHoW1rEns6jRW744k9nYa3qzM+bk74uDnj457/vIybM+nZuew/lcqBUynsO5XCgVOpHD+fwankLE4lZxXa19Gz6fw8qMUtfHciIlJq5eXAgRUAZFeNYMfaJAAah/3zP4RFRKT0MhgMN6ykSklSrVo1vv76a9q3b4/BYGDEiBHXVULlnxowYAATJkygatWq1KxZk9mzZ3Pu3LnrqgX/0ksvMWPGDAYMGED//v3Zt28fb7/9NoMHD7ZZ7DIuLo7BgwfzwgsvsG3bNmbPns3UqVOLPHd8fDzx8fEcPHgQgJ07d+Lp6UloaOgVk8zff/89586do3fv3nh7e9vs69ixI/Pnz6dv3768/fbbtG7dmipVqtClSxdyc3P58ccfGTp0KGFhYfTo0YNevXpZFxY9cuQICQkJdOrUibvvvhs3NzfeeOMNXn75ZTZu3EhUVNRVr5OPjw9+fn58+OGHhISEEBcXx7Bhw2zadO3alfHjx9OhQwcmTJhASEgIf/zxB2XLlqVZs2ZA/ocW99xzD0OHDqVXr15Xnb1uL3fev14REbGLSv7u9GlR5art6pUvY/M6JTOHgwmpJGXkkGe2kJOXXz4m12wmPTuP4V/vZG98CufTsynj5nyTohcREbngSDRkJYF7ADupTnbuRvzcnQnzK3oRbxERkdJo2rRp9OrVi3vvvRd/f3+GDh1KcnLyLY9j6NChxMfH0717dxwcHOjTpw8RERE4OBR/Fn65cuX48ccfee2116hfvz6+vr707t2bt956y6Zd9+7dycjIoGnTpjg4ODBw4ED69OlT5Lk/+OADm8U/L86cj4yMpGfPngXaz58/nzZt2hRIoEN+En3y5Mns2LGDVq1asWTJEsaOHcvEiRPx8vKynhvg/fff54033uCll17izJkzhIaG8sYbbwD5i8N++umnvPbaa8ybN4/WrVszatSoq74Xo9HI4sWLefnll6lTpw41atRg1qxZ1jrtkF+u5ZdffuHVV1+lXbt25ObmUqtWLebOnWtzrt69e7Nu3Tp69epVZJ/2ZLCU5AJCN0FycjLe3t4kJSXh5eVl73BEROQq2kxby8GEVOZ1b8yDtYLsHY6IyD+m8ejfSuS1+GkobPwAGj7DPJ/BjPtxDw/WCmJe98ZXP1ZEROSCzMxMYmNjqVSpEi4uLvYOp9Qxm82Eh4fTqVMnxo4de8PP36pVKxo0aMCMGTNu+LlLo7Fjx7JkyRJ27NhxU85f1L/Hax2PGgvdIyIiUgJcrM2+8bI66iIiIjfFsc35P6v8iy1HzgLQqKLqoYuIiJRkR44cYd68eezfv5+dO3fy4osvEhsby1NPPWXv0KQIqamp7Nq1izlz5jBgwAB7h1MkJdFFRKREu/tCEn3T4bN2jkRERO54ZjMk7gPAElSbrUfOA9BYSXQREZESzWg0EhUVRZMmTWjevDk7d+5k5cqVhIeH2zs0KUL//v1p1KgRrVq1KtGlXEA10UVEpIS7OBN91/EkUjJz8HRxsnNEIiJyx0o6Ctmp4OBMHMGcTj2Ik4OBOuUK1iEVERGRkqNChQpER0ffsv7WrFlzy/q6k0VFRV3TIqYlgWaii4hIiRbi7UqorxtmC2w9cs7e4YiIyJ0sYU/+T//qbD2aAkCdct64OBV/UTIRERERuXMoiS4iIiXexZIuG2NV0kVERG6ixAtJ9MBwtlz44FalXERERERESXQRESnxLpZ02aQkuoiI3EwXZ6IH1GTbhSS6FhUVERERESXRRUSkxLunsh8AO46dJyM7z87RiIjIHSthNwBpZaqz71R+OZe7lEQXERERKfWURBcRkRKvvI8rId4u5ORZ+CNOddFFROQmMOdB4n4AduWUxWKBUF83Aj1d7ByYiIiIiNibkugiIlLiGQwG1UUXEZGb62ws5GWBoyvRp90B1UMXERERkXxKoouIyG2haaX8ki4bY8/YORIREbkjXSjlQmBNth5NAlTKRURE5Hq0atWKQYMGWV+HhYUxY8aMIo8xGAx88803/7jvG3UekcspiS4iIreFuyvnz0T/I+48Wbmqiy4iIjdY4l4AzP41+SPuPACNw5REFxGR0qN9+/a0bdv2ivt+++03DAYDO3bsKPZ5N2/eTJ8+ff5peDZGjRpFgwYNCmw/efIkDz300A3t61KtWrXCYDAU+mjVqtVN6XfcuHHce++9uLm5UaZMmWId+/nnn+Pg4EC/fv1uSmylhZLoIiJyW6js746/hzNZuWZ2HEuydzgiInKnuTAT/ZRrZdKz8/A0OVIt0NPOQYmIiNw6vXv3ZsWKFRw7dqzAvsjISBo3bky9evWKfd6AgADc3NxuRIhXFRwcjMlkumnn//rrrzl58iQnT55k06ZNAKxcudK67euvv74p/WZnZ/Pkk0/y4osvFvvY+fPn8/rrr/P555+TmZl5E6K7dtnZ2Xbt/59QEl1ERG4LBoOBphfqom9SXXQREbnREvJnou/KKQdAw4o+OBgN9oxIRETklnrkkUcICAggKirKZntqaipLliyhd+/enDlzhq5du1KuXDnc3NyoW7cun3/+eZHnvbycy4EDB2jRogUuLi7UqlWLFStWFDhm6NChVK9eHTc3NypXrsyIESPIyckBICoqitGjR7N9+3brDPCLMV9ezmXnzp3861//wtXVFT8/P/r06UNqaqp1f8+ePenQoQPvvvsuISEh+Pn50a9fP2tfl/P19SU4OJjg4GACAgIA8PPzs25bvXo1tWvXxmQyERYWxtSpUwtci7Fjx9K1a1fc3d0pV64cc+fOLfL6AYwePZpXXnmFunXrXrXtpWJjY1m3bh3Dhg2jevXqV0zyL1iwwBpzSEgI/fv3t+47f/48L7zwAkFBQbi4uFCnTh2+//574MrfBpgxYwZhYWHW1xev77hx4yhbtiw1atQA4JNPPqFx48Z4enoSHBzMU089RUJCgs25/vzzTx555BG8vLzw9PTk/vvv59ChQ/zvf//DycmJ+Ph4m/aDBg3i/vvvL9b1KQ4l0UVE5LZx94W66Bv+Ul10ERG5gXKz4cwBAH5P8gegUahKuYiIyA1ksUB2mn0eFss1hejo6Ej37t2JiorCcskxS5YsIS8vj65du5KZmUmjRo344Ycf2LVrF3369OGZZ56xzsq+GrPZzOOPP46zszMbN27kgw8+YOjQoQXaeXp6EhUVxe7du5k5cybz5s1j+vTpAHTu3JlXX32V2rVrW2eAd+7cucA50tLSiIiIwMfHh82bN7NkyRJWrlxpkyQGWL16NYcOHWL16tV8/PHHREVFFfgg4Vps3bqVTp060aVLF3bu3MmoUaMYMWJEgXNNmTKF+vXr88cffzBs2DAGDhx4xQ8SboTIyEgefvhhvL29efrpp5k/f77N/vfff59+/frRp08fdu7cybJly6hatSqQ/7t66KGHiI6O5tNPP2X37t1MnDgRBweHYsWwatUq9u3bx4oVK6wJ+JycHMaOHcv27dv55ptvOHz4MD179rQec/z4cVq0aIHJZOLXX39l69at9OrVi9zcXFq0aEHlypX55JNPrO1zcnJYtGgRvXr1us4rdXWON+3MIiIiN9jFmehbj5wjN8+Mo4M+CxYRkRvgzEEw54LJi01nXIEUapf1sndUIiJyJ8lJh/Fl7dP3GyfA2f2amvbq1YspU6awdu1aa33vyMhIOnbsiLe3N97e3gwZMsTafsCAASxfvpwvv/ySpk2bXvX8K1euZO/evSxfvpyyZfOvx/jx4wvUMX/rrbesz8PCwhgyZAiLFy/m9ddfx9XVFQ8PDxwdHQkODi60r88++4zMzEwWLlyIu3v++58zZw7t27dn0qRJBAUFAeDj48OcOXNwcHCgZs2aPPzww6xatYrnn3/+mq7ZRdOmTaN169aMGDECgOrVq7N7926mTJlikyBu3rw5w4YNs7aJjo5m+vTpPPjgg8Xq72rMZjNRUVHMnj0bgC5duvDqq68SGxtLpUqVAHjnnXd49dVXGThwoPW4Jk2aAPm/q02bNrFnzx6qV68OQOXKlYsdh7u7Ox999BHOzs7WbZcmuytXrsysWbNo0qQJqampeHh4MHfuXLy9vVm8eDFOTk4A1hggv/RQZGQkr732GgDfffcdmZmZdOrUqdjxXStlH0RE5LZRI8gTb1cn0rPz2HUi2d7hiIjInSJxDwCWgJocPpMOQOWAa0s2iIiI3Elq1qzJvffey4IFCwA4ePAgv/32G7179wYgLy+PsWPHUrduXXx9ffHw8GD58uXExcVd0/n37NlDhQoVrAl0gGbNmhVo98UXX9C8eXOCg4Px8PDgrbfeuuY+Lu2rfv361gQ65CewzWYz+/bts26rXbu2zezqkJCQAqVFrrW/5s2b22xr3rw5Bw4cIC8vz7rt8vfbrFkz9uzJH4v07dsXDw8P6+OfWLFiBWlpabRr1w4Af39/HnzwQevvNiEhgRMnTtC6desrHh8TE0P58uVtktfXo27dujYJdMiftd++fXtCQ0Px9PSkZcuWANbfcUxMDPfff781gX65nj17cvDgQTZs2ADkl/jp1KmTze/6RtNMdBERuW0YjQaahPmycs8pNsWeoUGFMvYOSURE7gQJ+X+4ZpSpTsbBPByNBir43poF0EREpJRwcsufEW6vvouhd+/eDBgwgLlz5xIZGUmVKlWsSc4pU6Ywc+ZMZsyYQd26dXF3d2fQoEE3dMHI9evX061bN0aPHk1ERIR1RvLl9cVvlMsTtQaDAbPZfFP6upoxY8bYzPT/J+bPn8/Zs2dxdXW1bjObzezYsYPRo0fbbL+Sq+03Go02ZX+AK9aSvzyxfbHMTkREBIsWLSIgIIC4uDgiIiKs99HV+g4MDKR9+/ZERkZSqVIlfvrpJ9asWVPkMf+UkugiInJbuafyxST6Wfq0qGLvcERE5E5wIYke75L/1eZQXzecVDJMRERuJIPhmkuq2FunTp0YOHAgn332GQsXLuTFF1/EYMhfbDs6OppHH32Up59+GshPyu7fv59atWpd07nDw8M5evQoJ0+eJCQkBMA6m/iidevWUbFiRd58803rtiNHjti0cXZ2tpndXVhfUVFRpKWlWRO50dHRGI1G6wKXN1J4eDjR0dE226Kjo6levbrNTPfL3++GDRsIDw8H8pPDgYGB/ziWM2fO8O2337J48WJq165t3Z6Xl8d9993HL7/8Qtu2bQkLC2PVqlU88MADBc5Rr149jh07xv79+684Gz0gIID4+HgsFov1/oiJiblqbHv37uXMmTNMnDiRChUqALBly5YCfX/88cfk5OQUOhv9ueeeo2vXrpQvX54qVaoU+BbAjaaRoYiI3FYu1kXfFHuWPPO1LZAjIiJSpAtJ9EOG/D/kKvnfHkkOERGRm8HDw4POnTszfPhwTp48aVPPu1q1aqxYsYJ169axZ88eXnjhBU6dOnXN527Tpg3Vq1enR48ebN++nd9++80mWX6xj7i4OBYvXsyhQ4eYNWsWS5cutWkTFhZGbGwsMTExnD59mqysrAJ9devWDRcXF3r06MGuXbtYvXo1AwYM4JlnnrHWQ7+RXn31VVatWsXYsWPZv38/H3/8MXPmzCkwszw6OprJkyezf/9+5s6dy5IlS2xqkl9JXFwcMTExxMXFkZeXR0xMDDExMaSmpl6x/SeffIKfnx+dOnWiTp061kf9+vVp166ddYHRUaNGMXXqVGbNmsWBAwfYtm2btYZ6y5YtadGiBR07dmTFihXExsby008/8fPPPwPQqlUrEhMTmTx5MocOHWLu3Ln89NNPV71OoaGhODs7M3v2bP766y+WLVvG2LFjbdr079+f5ORkunTpwpYtWzhw4ACffPKJTRmeiIgIvLy8eOedd3j22Wev2u8/pSS6iIjcVmqFeOFhciQ5M5d98Sn2DkdERG53ORlw9i8Atmfl12dVEl1EREq73r17c+7cOSIiImzql7/11lvcddddRERE0KpVK4KDg+nQocM1n9doNLJ06VIyMjJo2rQpzz33HOPGjbNp85///IdXXnmF/v3706BBA9atW2ddrPOijh070rZtWx544AECAgL4/PPPC/Tl5ubG8uXLOXv2LE2aNOGJJ56gdevWzJkzp3gX4xrdddddfPnllyxevJg6deowcuRIxowZY/MhBOQn27ds2ULDhg155513mDZtGhEREUWee+TIkTRs2JC3336b1NRUGjZsSMOGDQvM4L5owYIFPPbYY9YZ4pfq2LEjy5Yt4/Tp0/To0YMZM2bw3nvvUbt2bR555BEOHDhgbfvVV1/RpEkTunbtSq1atXj99det3wAIDw/nvffeY+7cudSvX59NmzZdUymagIAAoqKiWLJkCbVq1WLixIm8++67Nm38/Pz49ddfSU1NpWXLljRq1Ih58+bZzEo3Go307NmTvLw8unfvftV+/ymD5fLiNXe45ORkvL29SUpKwsvLy97hiIjIdeixYBNr9yfydvtaPNu8kr3DEREpFo1H/1YirsWJGPiwJbj60jNgMWv2n2b8Y3V56u5Q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IiIiIiIicoM5OztTrVo1lXQRsSMnJ6d/NAP9IiXRRUREREREREREbgKj0YiLi4u9wxCRf0gFmURERERERERERERECqEkuoiIiIiIiIiIiIhIIZREFxEREREREREREREpRKmriW6xWABITk62cyQiIiIiUhpdHIdeHJeWZhqbi4iIiIg9XevYvNQl0VNSUgCoUKGCnSMRERERkdIsJSUFb29ve4dhVxqbi4iIiEhJcLWxucFSyqbAmM1mTpw4gaenJwaD4Zb2nZycTIUKFTh69CheXl63tG+5PegekaLo/pCr0T0iRdH9UXJYLBZSUlIoW7YsRmPprq6osbmUVLo/5Gp0j0hRdH/I1egeKTmudWxe6maiG41Gypcvb9cYvLy89A9EiqR7RIqi+0OuRveIFEX3R8lQ2megX6SxuZR0uj/kanSPSFF0f8jV6B4pGa5lbF66p76IiIiIiIiIiIiIiBRBSXQRERERERERERERkUIoiX4LmUwm3n77bUwmk71DkRJK94gURfeHXI3uESmK7g8RW/o3IUXR/SFXo3tEiqL7Q65G98jtp9QtLCoiIiIiIiIiIiIicq00E11EREREREREREREpBBKoouIiIiIiIiIiIiIFEJJdBERERERERERERGRQiiJfgvNnTuXsLAwXFxcuPvuu9m0aZO9QxI7mDBhAk2aNMHT05PAwEA6dOjAvn37bNpkZmbSr18//Pz88PDwoGPHjpw6dcpOEYs9TZw4EYPBwKBBg6zbdH/I8ePHefrpp/Hz88PV1ZW6deuyZcsW636LxcLIkSMJCQnB1dWVNm3acODAATtGLLdSXl4eI0aMoFKlSri6ulKlShXGjh3Lpcvg6B6R0k7jcgGNy6X4NDaXK9HYXAqjcfmdRUn0W+SLL75g8ODBvP3222zbto369esTERFBQkKCvUOTW2zt2rX069ePDRs2sGLFCnJycvj3v/9NWlqatc0rr7zCd999x5IlS1i7di0nTpzg8ccft2PUYg+bN2/m//7v/6hXr57Ndt0fpdu5c+do3rw5Tk5O/PTTT+zevZupU6fi4+NjbTN58mRmzZrFBx98wMaNG3F3dyciIoLMzEw7Ri63yqRJk3j//feZM2cOe/bsYdKkSUyePJnZs2db2+gekdJM43K5SONyKQ6NzeVKNDaXomhcfoexyC3RtGlTS79+/ayv8/Ly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Dtq1a0e3bt04e/bsLX2fIiIiIiIlmcblIiIli8FisVjsHYSIiNx8PXv25NNPP8XFxcVm+xtvvMEbb7yBwWCgb9++vP/++9Z999xzD3fddRfvvfce8+bNY+jQoRw9ehR3d3cAfvzxR9q3b8+JEycICgqiXLlyPPvss7zzzjtXjMFgMPDWW28xduxYIP8PAA8PD3766SfVgBQRERGRUkHjchGR249qoouIlCIPPPCAzWAcwNfX1/q8WbNmNvuaNWtGTEwMAHv27KF+/frWgTpA8+bNMZvN7Nu3D4PBwIkTJ2jdunWRMdSrV8/63N3dHS8vLxISEq73LYmIiIiI3HY0LhcRub0oiS4iUoq4u7sX+BrnjeLq6npN7ZycnGxeGwwGzGbzzQhJRERERKRE0rhcROT2oproIiJitWHDhgKvw8PDAQgPD2f79u2kpaVZ90dHR2M0GqlRowaenp6EhYWxatWqWxqziIiIiMidRuNyEZGSRTPRRURKkaysLOLj4222OTo64u/vD8CSJUto3Lgx9913H4sWLWLTpk3Mnz8fgG7duvH222/To0cPRo0aRWJiIgMGDOCZZ54hKCgIgFGjRtG3b18CAwN56KGHSElJITo6mgEDBtzaNyoiIiIiUoJpXC4icntREl1EpBT5+eefCQkJsdlWo0YN9u7dC8Do0aNZvHgxL730EiEhIXz++efUqlULADc3N5YvX87AgQNp0qQJbm5udOzYkWnTplnP1aNHDzIzM5k+fTpDhgzB39+fJ5544ta9QRERERGR24DG5SIitxeDxWKx2DsIERGxP4PBwNKlS+nQoYO9QxERERERKbU0LhcRKXlUE11EREREREREREREpBBKoouIiIiIiIiIiIiIFELlXERERERERERERERECqGZ6CIiIiIiIiIiIiIihVASXURERERERERERESkEEqii4iIiIiIiIiIiIgUQkl0EREREREREREREZFCKIkuIiIiIiIiIiIiIlIIJdFFRERERERERERERAqhJLqIiIiIiIiIiIiISCGURBcRERERERERERERKYSS6CIiIiIiIiIiIiIihfh/fD/tguy5ZwIAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1500x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def to_cpu_numpy(tensor):\n",
    "    return tensor.cpu().numpy()\n",
    "def to_cpu(list_):\n",
    "    if isinstance(list_, list):\n",
    "        return list(map(to_cpu_numpy,list_))\n",
    "    else:\n",
    "        return to_cpu_numpy(list_)\n",
    "plot_training_results(train_losses, to_cpu(train_top1_accs), to_cpu(train_top5_accs), val_losses, to_cpu(val_top1_accs), to_cpu(val_top5_accs))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "31661543",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "318a779b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8efdfd81",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "eda4f864",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2d4d9162",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
